有一个肮脏的漂亮技巧可以让你做到这一点。
这个hack的灵感可以在here
找到
想法
是为了让 android 认为刚刚安装了一个新的浏览器,给它一个带有典型浏览器意图过滤器的假组件。
我将提供一个小测试用例作为概念验证,由您决定如何在实际应用程序中使用它。
建议的方法
似乎是通用的,适用于很多情况(不仅适用于启动器和浏览器),并且仅取决于提供给解析器的意图过滤器。
假设我们想要覆盖一个默认的 Activity 来浏览简单的 http:// 链接
我们将在 AndroidManifest.xml 中与真实的浏览器活动一起声明一个虚假的浏览器活动:
<activity
android:name=".FakeActivity"
android:enabled="false">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="http" />
</intent-filter>
</activity>
FakeActivity 完全是空白:
public class FakeActivity extends Activity {}
我们将通过按下 activity_main.xml 中的一个简单按钮来显示应用选择器,并通过按下另一个按钮来测试默认行为:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
View changeDefaultButton = findViewById(R.id.changeDefButton);
changeDefaultButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showChooser();
}
});
View testDefaultButton = findViewById(R.id.testDefaultButton);
testDefaultButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
runDefaultApp();
}
});
}
void showChooser(){
PackageManager pm = getPackageManager();
ComponentName cm = new ComponentName(this, FakeActivity.class);
pm.setComponentEnabledSetting(cm, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
runDefaultApp();
pm.setComponentEnabledSetting(cm, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
}
void runDefaultApp(){
Intent selector = new Intent(Intent.ACTION_VIEW);
selector.setData(Uri.parse("http://stackoverflow.com"));
startActivity(selector);
}
每次单击changeDefaultButton,都会显示选择器对话框(假设至少安装了两个合适的浏览器应用程序)。此外,选择器对话框始终允许用户将所选应用程序设置为默认应用程序。
链接:
GitHub proof-of-concept project
希望这会有所帮助。