举个栗子我要启动91通讯录的拨号界面,首先我们获取91的包名,可以打印,也可以通过代码调出来,或者直接反编译
ComponentName componentName = new ComponentName(
"com.nd.desktopcontacts", //91通讯录包名
"com.nd.desktopcontacts.MainActivity"); //91通讯录的Activity名字
Intent intent = new Intent();
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setComponent(componentName);
intent.setAction("");
startActivity(intent);
finish();
包名也通过打印Log获取,最直接的办法是使用apktool 反编译apk. AndroidManifest.xml,直接查看包名,Activity,如我反编译91通讯录可以看到如下
拨号的Activity名字是
通过label判断是那个是拨号
com.nd.desktopcontacts.tmpphone
好我们吧靶Acitivity改为这个
改了跳转发现报错,可以判断对方Activity要接受ation,或者一些data信息,否则直接跳转报错,可以继续反编译classes.dex, 查看对方Activity需要哪些data,
private void initTabFlag(Intent paramIntent)
{
if (paramIntent == null) {}
label259:
label391:
for (;;)
{
return;
int i = paramIntent.getIntExtra("tabflag", -1);
if (i != -1) {
this.tabFlag = i;
}
String str = paramIntent.getAction();
if (str != null)
{
if (str.equals("android.intent.action.DIAL")) {
this.tabFlag = 0;
}
if (str.equals("android.intent.action.VIEW"))
{
if (paramIntent.getData() == null) {
break label259;
}
if ((paramIntent.getDataString().equals("content://com.android.contacts/contacts")) || (paramIntent.getDataString().equals("content"))) {
this.tabFlag = 1;
}
if ((paramIntent.getData().getScheme() != null) && (paramIntent.getData().getScheme().equals("tel"))) {
this.tabFlag = 0;
}
}
if (str.equals("android.intent.action.MAIN"))
{
if (paramIntent.getData() == null) {
break label321;
}
Log.e("MainActivity", "intent_data!=null:" + paramIntent.getData());
if ((!paramIntent.getDataString().equals("content://mms-sms/")) && (!paramIntent.getDataString().equals("content"))) {
break label271;
}
this.tabFlag = 2;
}
}
for (;;)
{
if (((!"android.intent.action.VIEW".equals(paramIntent.getAction())) || (!"vnd.android.cursor.dir/calls".equals(paramIntent.getType()))) && (!"com.android.phone.action.RECENT_CALLS".equals(paramIntent.getAction())) && (!"com.sec.android.app.dialertab.calllog.DetailViewActivity".equals(paramIntent.getAction()))) {
break label391;
}
this.tabFlag = 0;
return;
Log.e("MainActivity", "intent_data==null");
break;
label271:
if ((paramIntent.getExtras() != null) && (Integer.valueOf(getIntent().getExtras().getInt("tab_contact_flag")) != null))
{
this.tabFlag = Integer.valueOf(getIntent().getExtras().getInt("tab_contact_flag")).intValue();
continue;
label321:
if ((paramIntent.getType() != null) && (paramIntent.getType().equals("vnd.android-dir/mms-sms"))) {
this.tabFlag = 2;
} else if ((paramIntent.getExtras() != null) && (Integer.valueOf(paramIntent.getExtras().getInt("tab_contact_flag")) != null)) {
this.tabFlag = Integer.valueOf(paramIntent.getExtras().getInt("tab_contact_flag")).intValue();
}
}
}
}
}
Intent localIntent1 = new Intent();
localIntent1.setClassName("com.nd.desktopcontacts", "com.nd.desktopcontacts.tmpphone");
localIntent1.setAction("android.intent.action.MAIN");
localIntent1.putExtra("tab_contact_flag", 0);
// Intent localIntent2 = new Intent();
// localIntent2.putExtra("android.intent.extra.shortcut.INTENT", localIntent1);
// localIntent2.putExtra("android.intent.extra.shortcut.NAME", getString(R.string.hello_world));
// localIntent2.putExtra("android.intent.extra.shortcut.ICON_RESOURCE", Intent.ShortcutIconResource.fromContext(this, R.string.hello_world));
// setResult(-1, localIntent2);
// localIntent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(localIntent1);
finish();
总结
跨应用启动Acitivity,ManiAcitivity一般是可以启动的,但到启动应用的其他Acitivty,就需要看看靶Acitivity是否需要一些信息,如果需要则需反编译调查需要什么
Demo下载 运行Demo,在安装91通讯录2.3.4,下载里有91的反编译xml和 代码jar,