覆盖安装
长时间在后台 APP 重启的处理
1 2 3 4 5 6 7 8 9 10
| public final static int APP_STATUS_KILLED = 0; public final static int APP_STATUS_NORMAL = 1; public static int APP_STATUS = APP_STATUS_KILLED;
if (Constants.APP_STATUS != Constants.APP_STATUS_NORMAL) { BookLogger.e(TAG, "非正常启动流程,直接重新初始化应用界面") CommonUtil.reInitApp() finish() return }
|
startService
Android 8.0 行为变更:后台执行限制
Android 8.0 还对特定函数做出了以下变更:如果针对 Android 8.0 的应用尝试在不允许其创建后台服务的情况下使用 startService() 函数,则该函数将引发一个 IllegalStateException。
新的 Context.startForegroundService() 函数将启动一个前台服务。现在,即使应用在后台运行,系统也允许其调用 Context.startForegroundService()。不过,应用必须在创建服务后的五秒内调用该服务的 startForeground() 函数。
1 2 3 4 5 6 7 8 9
| public static void start(Context context) { Intent intent = new Intent(context, InitializeService.class); intent.setAction(ACTION_INIT); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ context.startForegroundService(intent); } else{ context.startService(intent); } }
|
小米手机适配
可以说小米手机对android系统定制得让人头痛,好好的应用跑在小米手机上多多少少会点问题。
短信发送失败无回调
在发送短信时候,若系统拦截之后,若用户点击拒绝发送短信,这个时候发现一直收不到系统发送短信失败的广播回调,就会出现无回调不知道短信是否发送成功,这对于需要监听短信发送结果的要求是一个打击,用户往往很可能拒绝发送短信。
解决方案:使用安卓系统的权限管理进行权限,既能接受说明发送短信意图也能收到回调。这个时候系统在有权限申请之后,不会再默认拦截了。
隐藏显示刘海会使当前activity重建,会造成数据不正确的问题,强制让应用回到首页
1 2 3 4 5 6 7 8 9 10 11
| int force_black_v2 = Settings.Global.getInt(mContext.getContentResolver(), "force_black_v2", 0); int local = (int) SharePrefUtil.get("force_black_v2", 0); if (AppStatusManager.getInstance().getAppStatus() == AppStatus.STATUS_RECYCLE || local != force_black_v2) { SharePrefUtil.put("force_black_v2", force_black_v2); //跳到MainActivity,让MainActivity也finish掉 Intent intent = new Intent(this, SplashActivity.class); startActivity(intent); finish(); return;
|
- 应用安装完成后打开应用出现初始化两次
是指在调用系统安装应用程序完成安装之后,若用户直接通过这个程序打开应用进入之后,用户按home键退出回到桌面应用程序列表,又点击该应用的icon重新进入该应用,却发现应用是重新打开,而不是继续上次离开的界面,按道理应用不应该重新初始化,后面经搜索发现这是个系统bug。
解决方案:在启动Activity onCreate方法中进行判断是否重复启动
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (!isTaskRoot() && getIntent().hasCategory(Intent.CATEGORY_LAUNCHER) && getIntent().getAction() != null && getIntent().getAction().equals(Intent.ACTION_MAIN)) { finish(); return; } }
|
- 静态注册广播收不到广播
在注册系统广播之后,收到广播是有条件,并不是每次都能够收到,在该品牌机型中要求:Receiver注册不能配置运行在非该应用包名下的进程中,否则收不到广播,广播只给不配置android:process的Receiver。同时要求是在当前进程应用没有退出的前提下,否则也收不到。
暂没有找到解决方案
- 悬浮窗适配
开启悬浮窗之前,检查如果是否有悬浮窗权限,如果系统没有赋予 APP 弹出悬浮窗的权限,就先跳转到权限授权界面,等用户打开该权限之后,再去弹出悬浮窗,比如 QQ 等一些主流应用就是这么做得
华为机型
Toast不显示 (荣耀手机)
也是偶然发现在荣耀8机型上后台应用的toast不会被显示出来,只能当前在前台的应用TOAST提示。
解决方案:替换toast显示,改用其他方式,如dialog或者弹出activity界面。
多网络下指定网络不成功
简单讲就是指wifi和移动网络同时开着的情况下,不能指定移动网络访问,详见接受说明移步到我的另一篇文章:http://blog.csdn.net/u010019468/article/details/72886859
这个权限是普通权限,在华为6.0手机上,一旦targerSdk》23就没有权限,也不能申请。只能把targetSdk降低到23以下,目前在华为p8电信版手机发现
华为手机:因为某些机型是虚拟按键的,所以要加上以下设置防止挡住按键. setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
空字符串AES解密崩溃
在华为c8817d手机上出现了这个问题,虽然不怎么规范,却反应了这个问题。
其他
5.0以上的手机,如果禁止了权限,那么toast也会被禁止,建议通过弹窗的形式
1 2 3 4 5 6 7 8 9 10 11 12
| HqToastUtils.showToast(GlobalContext.getString(R.string.main_open_notification)) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.BASE) { // 进入设置系统应用权限界面 Intent intent = new Intent(Settings.ACTION_SETTINGS) mContext.startActivity(intent) return } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {// 运行系统在5.x环境使用 // 进入设置系统应用权限界面 Intent intent = new Intent(Settings.ACTION_SETTINGS) mContext.startActivity(intent) return }
|