我是安卓开发,最近在开发一个功能,需求是别的页面访问要根据不同情况展示不同的页面,而判断逻辑却要统一写在一个地方.由于是统一由外部调用,自然是判断逻辑写在我这边,一种是直接打开一个空页面,逻辑写在空页面里,然后再打开需要打开的页面,但是此方法就多打开了一个页面,对很多交互处理甚是麻烦.于是我想到把逻辑处理写在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,意思是包含处于停止状态的程序,这样就可以激活停止状态的程序。