ARouter或startActivity多次调用时页面Intent更新

ARouter或startActivity多次调用时页面Intent更新

大致调用过程是这样A.apk中有MainActivity,subActivity两个页面,MainActivity会通过ARouter开启subActivity并传Intent过来更新sub的页面。
B.apk中调用startActivity去开启A.apk中的MainActivity并传Intent更新MainActivity页面。

问题

  1. 会有多个相同的Activity被创建
  2. 多次调用ARouter或startActivity后,发现传递的Intent没有被更新

示例代码

以第三方APK调用其他APK中的页面为例:
此为B.apk代码

        Intent intent = new Intent(ACTION_MAIN)
        ComponentName componentName = new ComponentName("com.xxx.package", "com.xxx.package.MainActivity")
        intent.setComponent(componentName)
        intent.putExtra("query", "更新给MainActivity页面的Intent参数")

A.apk代码, 这里以kotlin写的

subActivity 与 MainActivity代码中的onCreate差不多, 一个是ARouter来获取传递来的参数,另一个则是通过getIntent来获取
subActivity:

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_sub)
        try {
            ARouter.getInstance().inject(this); // 通过它来得到传递来的参数
        } catch (e: Exception) {
            e.printStackTrace()
        }

        Log.d(TAG, "onCreate")
        showResult() // 这里更新页面
    }

MainActivity:

     val intentData = intent
            if (intentData != null) {
                remoteQuery = intentData.getStringExtra("query")!!
            } else {
                Log.d(TAG, "intent is null")
            }

解决方法

  1. 在androidManifest里面对这个activity的launchMode设置为singleInstance
<activity android:name="com.xxxxx.MainActivity" android:launchMode="singleInstance" />
<activity android:name="com.xxxxx.subActivity" android:launchMode="singleInstance" />
  1. MainActivity, subActivity中加上onNewIntent的重载,然后更新intent或ARouter传的参数值
    override fun onNewIntent(intent: Intent?) {
        super.onNewIntent(intent)
        ARouter.getInstance().inject(this) // 注意ARouter要调用这一行
        setIntent(intent)
        Log.d(TAG, "onNewIntent")
        // 在此更新页面
    }

作者:帅得不敢出门

你可能感兴趣的:(Android平台,android,kotlin,android,studio)