Android广播、Intent隐式启动模拟第三方授权登录

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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容