Intent隐式启动实现
server端定义AuthorActivity
的隐式启动需要的intent-filter,并在关闭页面时传递授权结果
<activity
android:name=".AuthorActivity"
android:launchMode="singleTask"
>
<intent-filter>
<action android:name="com.code.broardcast.server" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="xxx" />
</intent-filter>
</activity>
@Override
public void finish() {
//传递授权结果
Intent intent = new Intent();
intent.putExtra("data", "code");
setResult(0, intent);
super.finish();
}
client端startActivityForResult
发起调用并通过onActivityResult
接收授权登录结果
Intent intent = new Intent();
intent.setAction("com.code.broardcast.server");
intent.addCategory("xxx");
//请求打开授权页面
startActivityForResult(intent,0);
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//获取授权结果
String result = data.getStringExtra("data");
}
这种方式在Server端安装还未打开时,会提示以下弹窗
image.png
Broaardcast实现
Server端Mainifest定义广播接收器,并在广播中启动AuthorActivity
,这种方式不能直接通过activityresult传递授权结果,可以考虑使用广播将结果发回Client端,或者提供ContentProvider给Client查询授权结果
<receiver android:name=".AuthorReceiver">
<intent-filter>
<action android:name="com.code.broardcast.server" />
</intent-filter>
</receiver>
public class AuthorReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent intent1 = new Intent(context, AuthorActivity.class);
//启动一个新的Task
intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent1);
}
}
Client端发送授权广播,android 8对广播做了相关限制,需要增加ComponentName
参数
Intent intent = new Intent();
intent.setAction("com.code.broardcast.server");
//android8对广播做了限制需要明确目标广播
intent.setComponent(new ComponentName("com.code.broadcastserver","com.code.broadcastserver.AuthorReceiver"));
sendBroadcast(intent);
此方案在小米手机上注意开启权限或者动态去申请权限,此权限为小米ROM独有
image.png
没有此权限启动AuthorActivity提示一下错误
2019-11-07 16:17:18.678 24757-24757/com.code.broadcastserver I/Timeline: Timeline: Activity_launch_request time:8440149 intent:Intent { flg=0x10000000 cmp=com.code.broadcastserver/.AuthorActivity }
2019-11-07 16:17:18.681 1818-3407/? I/ActivityManager: START u0 {flg=0x10000000 cmp=com.code.broadcastserver/.AuthorActivity} from uid 10471
2019-11-07 16:17:18.681 1818-3407/? D/com.android.server.am.ExtraActivityManagerService: MIUILOG- Permission Denied Activity : Intent { flg=0x10000000 cmp=com.code.broadcastserver/.AuthorActivity } pkg : com.code.broadcastserver uid : 10471 tuid : 10165