需求:开机启动服务监听广播,当收到广播xxx时候上传log到服务器原来在android7.1上已经实现,移植到8.1上面发现收不到广播,网上查询8.1后对广播有限制,试了网上方法都没用,请教大佬如何解决?广播接收器:
public class UploadLogReceiver extends BroadcastReceiver {
    private static final String BOAD= "android.intent.action.gmt.logupload";
    private static final String ACTION_BOOT = "android.intent.action.BOOT_COMPLETED";
    @Override
    public void onReceive(Context context, Intent intent) {
        String action=intent.getAction();
        if(action.equals(BOAD)){
            Log.i("test","=================receiver BOAD======");
        }else if(action.equals(Intent.ACTION_BOOT_COMPLETED)){
            Log.i("test","========receiver bootservice, start back service======");
            Intent intentt = new Intent(context, UploadLogService.class);
            context.startService(intentt);
        }else if(action.equals("android.intent.action.QUICKBOOT_POWERON")){
            Log.i("test","========1111111111111111111111111111111111======");
        }
    }
}
服务public class UploadLogService extends Service {
    private String TAG="test";
    private String BOARD_UPLOAD="android.intent.action.gmt.logupload";
    private UploadLogReceiver receiver=new UploadLogReceiver();    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }    @Override
    public void onCreate() {
        super.onCreate();
        Log.i(TAG,"定时6小时执行===================");
        IntentFilter intentFilter=new IntentFilter();
        intentFilter.addAction(BOARD_UPLOAD);
        registerReceiver(receiver,intentFilter);
    }    @Override
    public void onDestroy() {
        super.onDestroy();
        unregisterReceiver(receiver);
    }
}

解决方案 »

  1.   

    你用本地广播,并且使用 bind方式启动
      

  2.   

    有很多可能的,我简单说一下把。
    1.可以是程序安装在disk中造成的。因为系统发出广播后才加载disk中的程序。
    2.不知道从某个版本,你必须要手动运行下你的程序。这样是防止恶意程序。
    3.广播一定要静态注册。
      

  3.   

    方法一: 使用动态广播代替静态广播
    方法二: 保留原来的静态广播,但是加入Component参数
    Intent intent =new Intent("test");
    //参数一是你的包名,参数二是你的接收器的路径
    intent.setComponent(new ComponentName("com.example.xlk","com.example.MyBroadCastReceiver"));
    sendBroadcast( intent );
      

  4.   

    谢谢两位解答,我是先在android studio里面写了一个程序测试可以收到才在setting里面写的,但是提示: E ActivityManager: Sending non-protected broadcast android.intent.action.gmt.logupload from system 1157:com.viomi.fridge.vertical/u0a22 pkg com.viomi.fridge.vertical我在as里面写的是广播接收器是:public class UploadLogReceiver extends BroadcastReceiver {
        private static final String BOAD= "android.intent.action.gmt.logupload";
        private static final String ACTION_BOOT = "android.intent.action.BOOT_COMPLETED";
        @Override
        public void onReceive(Context context, Intent intent) {
            String action=intent.getAction();
            if(action.equals(BOAD)){
                Log.i("test","=================receiver BOAD======");
            }else if(action.equals(Intent.ACTION_BOOT_COMPLETED)){
                Log.i("test","========receiver bootservice, start back service======");
                
            }else if(action.equals("android.intent.action.QUICKBOOT_POWERON")){
                Log.i("test","========1111111111111111111111111111111111======");
            }
        }
    }
      

  5.   

    我是在源码的setting里面改的