Android 8.0后台执行限制

Android O对应用在后台运行时可以执行的操作施加了限制,称为后台执行限制(Background Execution Limits),这可以大大减少应用的内存使用和耗电量,提高用户体验。后台执行限制分为两个部分:后台服务限制(Background Service Limitations)、广播限制(BroadcastLimitations)。


后台服务限制

如何才算是后台应用?除了下面情况外都是后台应用

1. 具有可见的Activity

2. 具有前台服务

3. 另一个前台应用已关联到该应用(通过bindService或者使用该应用的ContentProvider)。


当应用处于后台时:

1.在后台运行的服务在几分钟内会被stop掉(模拟器测试在1分钟左右后被kill掉)。在这段时间内,应用仍可以创建和使用服务。

2.在应用处于后台几分钟后(模拟器测试1分钟左右),应用将不能再通过startService创建后台服务,如果创建则抛出以下异常

[java] view plain copy
  1. Caused by: java.lang.IllegalStateException: Not allowed to start service Intent { cmp=com.example.samsung.test/.TestService }: app is in background  
应用处于后台时,虽然不能通过 startService 创建后台服务,但仍可以通过下面的方式创建前台服务。
[java] view plain copy
  1. NotificationManager noti = (NotificationManager)getApplicationContext().getSystemService(NOTIFICATION_SERVICE);  
  2. noti.startServiceInForeground();  

后台服务会被kill掉,官方推荐可使用AlarmManager、SyncAdapter、JobScheduler代替后台服务。


广播限制

如果应用监听一些系统广播,当系统发出广播时,很多应用都会被唤醒,这会导致所有应用快速地连续消耗资源,从而降低用户体验。其实,大部分应用都不会处理这个广播,应用只是唤醒一下看看和自己是否有关,为了缓解这一问题,Android N对一些广播做出了限制:

1.targetSdkVersionAndroid NAPI level 24)及以上的应用,如果应用在AndroidManifest.xml中静态注册CONNECTIVITY_ACTION这个receiver,应用将不能收到此广播。如果应用使用Context.registerReceiver()动态注册receiver,应用仍可以收到这个广播。

2.运行在Android N及以上设备的应用,无论是targetSdkVersion是否是Android N,应用都不能发送或者接收ACTION_NEW_PICTUREACTION_NEW_VIDEO这两个广播。


Android O执行了更为严格的限制。

1.动态注册的receiver,可接收任何显式和隐式广播。

2.targetSdkVersionAndroid OAPI level 26)及以上的应用,静态注册的receiver将不能收到隐式广播,但可以收到显式广播。下面例子说明

清单文件的receiver声明

[html] view plain copy
  1. <receiver  
  2.     android:name=".TestReceiver"  
  3.     android:enabled="true">  
  4.     <intent-filter>  
  5.         <action android:name="com.test.example.testreceiver.action"></action>  
  6.     </intent-filter>  
  7. </receiver>  


Receiver类定义

[java] view plain copy
  1. public class TestReceiver extends BroadcastReceiver {  
  2.     @Override  
  3.     public void onReceive(Context context, Intent intent) {  
  4.         Toast.makeText(context, "onReceive", Toast.LENGTH_SHORT).show();  
  5.     }  
  6. }  


①如果这样发送隐式广播,receiver将接收不到广播。

[java] view plain copy
  1. Intent intent = new Intent();  
  2. intent.setAction("com.test.example.testreceiver.action");  
  3. sendBroadcast(intent);  


②如果这样发送显式广播,receiver仍可以接收到广播

[java] view plain copy
  1. Intent intent = new Intent();  
  2. intent.setClassName("com.test.example.testreceiver""com.test.example.testreceiver.TestReceiver");  
  3. sendBroadcast(intent);  


虽然静态注册的receiver不能接收隐式广播,但Google考虑到一些广播也不频繁发生,也有一些例外,对这些例外的静态注册的receiver,仍可接收隐式和显式广播。

ACTION_LOCKED_BOOT_COMPLETED、ACTION_BOOT_COMPLETED

ACTION_USER_INITIALIZE

ACTION_TIMEZONE_CHANGED

ACTION_LOCALE_CHANGED

ACTION_USB_ACCESSORY_ATTACHED

ACTION_USB_ACCESSORY_DETACHED

ACTION_USB_DEVICE_ATTACHED

ACTION_USB_DEVICE_DETACHED

ACTION_HEADSET_PLUG

……

详情请参考

https://developer.android.com/preview/features/background-broadcasts.html


据Google工程师透露,Google的目标是充满一次电,手机可用2~3天,这也可看到Google在手机续航方面的努力。

目前只有Android Studio2.4可以下载Android O 预览版SDK,下载地址

https://dl.google.com/dl/android/studio/ide-zips/2.4.0.6/android-studio-ide-171.3934896-windows.zip


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值