我是安卓开发,最近在开发一个功能,需求是别的页面访问要根据不同情况展示不同的页面,而判断逻辑却要统一写在一个地方.由于是统一由外部调用,自然是判断逻辑写在我这边,一种是直接打开一个空页面,逻辑写在空页面里,然后再打开需要打开的页面,但是此方法就多打开了一个页面,对很多交互处理甚是麻烦.于是我想到把逻辑处理写在BroadcastReceiver里,外部统一调我这个BroadcastReceiver,再由我做逻辑判断打开需要的页面,大致代码如此:

<receiver
android:name=".receiver.StaticReceiver"
android:exported="true"
android:permission="com.pptv.usercenter.permission.broadcast">
<intent-filter android:priority="1000">
<action android:name="com.pptv.usercenter.action.account" />
</intent-filter>
</receiver>

public class StaticReceiver extends BroadcastReceiver {

   @Override

   public void onReceive (Context context, Intent intent) {

       LogUtils.w(intent.toString());

       switch (Objects.requireNonNull(intent.getAction())) {

           case Const.Action.ACCOUNT:

               ComUtils.jumpAccount(context,intent.getBooleanExtra(Const.Key.NEED_FINISH_LOADING,false));

               break;

       }

   }

}

    public static void jumpAccount (Context context, boolean isNeedLoadingFinish) {

       Intent intent;

       if ( UcApp.sUser != null ) {

           intent = new Intent(context, AccountManageActivity.class);

       } else {

           if ( 0 < AccountFty.getInstance().getRecordCount() ) {

               intent = new Intent(context, AccountSelectActivity.class);

           } else {

               intent = new Intent(context, LoginActivity.class);

           }

       }

       intent.putExtra(Const.Key.NEED_FINISH_LOADING, isNeedLoadingFinish);

       if ( context instanceof Activity ) {

           ((Activity) context).startActivityForResult(intent, Const.ReqCode.LOGIN);

       } else {

           intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

           context.startActivity(intent);

       }

   }

踩过几个坑,有时别人无法打开我的页面,发现其实是广播没有打开,总结一下

1、最好做成静态注册广播,动态注册的广播你的程序非系统程序可能进程并非是常驻的,这时你进程都是没得,更不可能打开调起你的广播了

2、设置permission="com.pptv.usercenter.permission.broadcast"配置文件里也记得申明

<permission
android:name="com.pptv.usercenter.permission.broadcast"
android:protectionLevel="signature" />

要调你广播的app也要申请

<uses-permission android:name="com.pptv.usercenter.broadcast" />

3、要调广播的intent加上flag

intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);

通常的intnet广播,处于停止状态的程序的receiver是无法接受到的。可以在后台服务或者应用中发送广播时,增加一个FLAG_INCLUDE_STOPPED_PACKAGES 的flag,意思是包含处于停止状态的程序,这样就可以激活停止状态的程序。