Android 机型适配问题整理

覆盖安装

长时间在后台 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; //记录App的启动状态

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);

//防止重复创建的问题,第一次安装完成启动,和home键退出点击launcher icon启动会重复
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;
}

Android 机型适配问题整理
http://peiniwan.github.io/2024/04/ee1cb6389b10.html
作者
六月的雨
发布于
2024年4月6日
许可协议