ARouter或startActivity多次调用时页面Intent更新
大致调用过程是这样A.apk中有MainActivity,subActivity两个页面,MainActivity会通过ARouter开启subActivity并传Intent过来更新sub的页面。
B.apk中调用startActivity去开启A.apk中的MainActivity并传Intent更新MainActivity页面。
问题
- 会有多个相同的Activity被创建
- 多次调用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")
}
解决方法
- 在androidManifest里面对这个activity的launchMode设置为singleInstance
<activity android:name="com.xxxxx.MainActivity" android:launchMode="singleInstance" />
<activity android:name="com.xxxxx.subActivity" android:launchMode="singleInstance" />
- MainActivity, subActivity中加上onNewIntent的重载,然后更新intent或ARouter传的参数值
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
ARouter.getInstance().inject(this) // 注意ARouter要调用这一行
setIntent(intent)
Log.d(TAG, "onNewIntent")
// 在此更新页面
}
作者:帅得不敢出门