大理中小企业网站建设,搜索引擎在哪里获取网站,手机中国第一手机门户,wordpress 双域名前言 最近有项目过程中#xff0c;有做app的同事反馈#xff0c;三方应用无法监听关机广播。特地研究了下关机广播为啥监听不到。
1.原因#xff1a;发送关机广播的类是ShutdownThread.java#xff0c;添加了flag:Intent.FLAG_RECEIVER_FOREGROUND | Intent.FLAG_RECEIVER…前言 最近有项目过程中有做app的同事反馈三方应用无法监听关机广播。特地研究了下关机广播为啥监听不到。
1.原因发送关机广播的类是ShutdownThread.java添加了flag:Intent.FLAG_RECEIVER_FOREGROUND | Intent.FLAG_RECEIVER_REGISTERED_ONLY,表示只有在代码中动态注册并且是前台服务和应用才能收到所以在AndroidManifest.xml注册无法收到关机广播后台服务中动态注册也无法收到。 2.前台服务注册关机广播。 1.启动前台服务
public class BootCompleteReceiver extends BroadcastReceiver {private static final String TAG BootCompleteReceiver;Overridepublic void onReceive(Context context, Intent intent) {if (intent ! null) {if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
// ComponentName powerService new ComponentName(com.android.mytest, com.android.mytest.PowerService);
// Intent mIntent new Intent();
// mIntent.setComponent(powerService);Intent powerServiceIntent new Intent(context, PowerService.class);context.startForegroundService(powerServiceIntent);Log.d(TAG, startForegroundService);}}}
}
2、添加前台服务权限配置相关属性 权限 uses-permission android:nameandroid.permission.RECEIVE_BOOT_COMPLETED /uses-permission android:nameandroid.permission.INTERNET /uses-permission android:nameandroid.permission.FOREGROUND_SERVICE /
服务配置: serviceandroid:name.PowerServiceandroid:foregroundServiceTypemediaPlaybackandroid:enabledtrueandroid:exportedfalse intent-filteraction android:namecom.gwm.car.PowerService//intent-filter/service
3.注册关机广播
package com.android.mytest;import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;
import android.util.Log;import androidx.annotation.Nullable;public class PowerService extends Service {private static final String TAG PowerService;public ShutdownBroadcastReceiver mShutdownBroadcastReceiver;Overridepublic void onCreate() {super.onCreate();Log.d(TAG, onCreate);mShutdownBroadcastReceiver new ShutdownBroadcastReceiver();}private Notification getNotification() {NotificationChannel channel new NotificationChannel(channel_id, channel_name, NotificationManager.IMPORTANCE_DEFAULT);NotificationManager manager (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);if (manager ! null) {manager.createNotificationChannel(channel);}return new Notification.Builder(this, channel_id).setContentTitle(shutdown).setContentText(Listening for shutdown)
// .setAutoCancel(true).setSmallIcon(R.mipmap.ic_launcher_round).build();}Overridepublic int onStartCommand(Intent intent, int flags, int startId) {Log.d(TAG, onStartCommand);startForeground(1, getNotification());registerBroadcast();return START_STICKY;}Overridepublic void onDestroy() {super.onDestroy();Log.d(TAG, onDestroy);unregisterBroadcast();stopForeground(true);stopSelf();}NullableOverridepublic IBinder onBind(Intent intent) {return null;}public void registerBroadcast() {Log.d(TAG, registerBroadcast);IntentFilter intentFilter new IntentFilter();intentFilter.addAction((Intent.ACTION_SHUTDOWN));registerReceiver(mShutdownBroadcastReceiver,intentFilter);}public void unregisterBroadcast() {if (mShutdownBroadcastReceiver ! null) {unregisterReceiver(mShutdownBroadcastReceiver);}}
}4.关机广播实现 package com.android.mytest;import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;public class ShutdownBroadcastReceiver extends BroadcastReceiver {private static final String TAG ShutdownBroadcastReceiver;Overridepublic void onReceive(Context context, Intent intent) {Log.d(TAG, zjy onReceive intent:intent);}
}5.本地验证