学而不思则罔,思而不学则殆
偏好设置
在Android中启动一个Activity(隐式启动),如果落地页>1,那么系统就会弹出选在弹窗,让你选择一个默认的落地页面,如图:
通过命令 dumpsys查看当前栈顶的Activity:
mResumedActivity: ActivityRecord{4650966 u0 android/com.android.internal.app.ResolverActivity t840}
ResolverActivity这是系统Activity,专门处理偏好设置的页面。当隐式启动没有设置默认偏好的时候就会启动这个页面。
DeepLink
上面的例子中我在两个应用中注册了DeepLink,如下:
注册
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="wxf"
android:path="/love"
android:scheme="zy" />
</intent-filter>
</activity>
启动
//发送DeepLink
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("zy://wxf/love?name=zhangyu&id=5201314")));
校验落地页
实际在开发中不能这么写,有可能没有落地页,那么就会报错,所以一般需要在启动的时候查询一下Intent是否存在接收方。
未设置默认落地页
PackageManager pm = getPackageManager();
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("zy://wxf/love?name=zhangyu&id=5201314"));
ResolveInfo resolveInfo = pm.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
Log.d("zhangyu", "resolveInfo:" + resolveInfo);
当我们没有设置偏好设置的时候,返回的是系统设置偏好的页面(ResolverActivity ):
2020-09-04 08:17:08.463 13352-13352/com.example.leakdemo D/zhangyu: resolveInfo:ResolveInfo{33175ae android/com.android.internal.app.ResolverActivity m=0x0}
已设置默认落地页
当我们设置了默认偏好:
结果如下:
2020-09-04 08:21:24.911 13678-13678/com.example.leakdemo D/zhangyu: resolveInfo:ResolveInfo{7c0b4c8 com.example.myapplication/.MainActivity m=0x508000}
这个是否查询落地页就是目的页了,而不再是偏好设置页;
当然如果想删除这个偏好设置,需在【设置】-【应用管理】-【具体应用】-【默认打开】-【清除默认操作】:
落地页不存在
设置一个错误的页面:
改成love404,这个协议没有注册
PackageManager pm = getPackageManager();
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("zy://wxf/love404?name=zhangyu&id=5201314"));
ResolveInfo resolveInfo = pm.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
Log.d("zhangyu", "resolveInfo:" + resolveInfo);
结果如下:返回的resolveInfo:null,这种情况下在项目中一般就需要提示用户,不能直接跳转。
2020-09-04 08:18:45.616 13580-13580/com.example.leakdemo D/zhangyu: resolveInfo:null