Android O对应用在后台运行时可以执行的操作施加了限制,称为后台执行限制(Background Execution Limits),这可以大大减少应用的内存使用和耗电量,提高用户体验。后台执行限制分为两个部分:后台服务限制(Background Service Limitations)、广播限制(BroadcastLimitations)。
后台服务限制
如何才算是后台应用?除了下面情况外都是后台应用
1. 具有可见的Activity
2. 具有前台服务
3. 另一个前台应用已关联到该应用(通过bindService或者使用该应用的ContentProvider)。
当应用处于后台时:
1.在后台运行的服务在几分钟内会被stop掉(模拟器测试在1分钟左右后被kill掉)。在这段时间内,应用仍可以创建和使用服务。
2.在应用处于后台几分钟后(模拟器测试1分钟左右),应用将不能再通过startService创建后台服务,如果创建则抛出以下异常
- Caused by: java.lang.IllegalStateException: Not allowed to start service Intent { cmp=com.example.samsung.test/.TestService }: app is in background
- NotificationManager noti = (NotificationManager)getApplicationContext().getSystemService(NOTIFICATION_SERVICE);
- noti.startServiceInForeground();
后台服务会被kill掉,官方推荐可使用AlarmManager、SyncAdapter、JobScheduler代替后台服务。
广播限制
如果应用监听一些系统广播,当系统发出广播时,很多应用都会被唤醒,这会导致所有应用快速地连续消耗资源,从而降低用户体验。其实,大部分应用都不会处理这个广播,应用只是唤醒一下看看和自己是否有关,为了缓解这一问题,Android N对一些广播做出了限制:
1.targetSdkVersion为Android N(API level 24)及以上的应用,如果应用在AndroidManifest.xml中静态注册CONNECTIVITY_ACTION这个receiver,应用将不能收到此广播。如果应用使用Context.registerReceiver()动态注册receiver,应用仍可以收到这个广播。
2.运行在Android N及以上设备的应用,无论是targetSdkVersion是否是Android N,应用都不能发送或者接收ACTION_NEW_PICTURE和ACTION_NEW_VIDEO这两个广播。
而Android O执行了更为严格的限制。
1.动态注册的receiver,可接收任何显式和隐式广播。
2.targetSdkVersion为Android O(API level 26)及以上的应用,静态注册的receiver将不能收到隐式广播,但可以收到显式广播。下面例子说明
清单文件的receiver声明
- <receiver
- android:name=".TestReceiver"
- android:enabled="true">
- <intent-filter>
- <action android:name="com.test.example.testreceiver.action"></action>
- </intent-filter>
- </receiver>
Receiver类定义
- public class TestReceiver extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- Toast.makeText(context, "onReceive", Toast.LENGTH_SHORT).show();
- }
- }
①如果这样发送隐式广播,receiver将接收不到广播。
- Intent intent = new Intent();
- intent.setAction("com.test.example.testreceiver.action");
- sendBroadcast(intent);
②如果这样发送显式广播,receiver仍可以接收到广播
- Intent intent = new Intent();
- intent.setClassName("com.test.example.testreceiver", "com.test.example.testreceiver.TestReceiver");
- 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