如何启动另外一个应用的任意Activity

来源:互联网 发布:linux 没有nslookup 编辑:程序博客网 时间:2024/04/30 13:54


举个栗子我要启动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();

可以发现确实启动了91通讯录,但是我们要默认进入其他界面,则需要反编译apk查看具体的配置文件



包名也通过打印Log获取,最直接的办法是使用apktool 反编译apk. AndroidManifest.xml,直接查看包名,Activity,如我反编译91通讯录可以看到如下


拨号的Activity名字是

        <activity-alias android:label="@string/shortcut_contact" android:icon="@drawable/ic_launcher_shortcut_contact" android:name="com.nd.desktopcontacts.tmpcontacts" android:targetActivity="com.nd.desktopcontacts.MainActivity">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.DEFAULT" />            </intent-filter>        </activity-alias>        <activity-alias android:label="@string/shortcut_mms" android:icon="@drawable/ic_launcher_shortcut_sms" android:name="com.nd.desktopcontacts.tmpmms" android:targetActivity="com.nd.desktopcontacts.MainActivity">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.DEFAULT" />            </intent-filter>        </activity-alias>        <activity-alias android:label="@string/shortcut_dial" android:icon="@drawable/ic_launcher_shortcut_dial" android:name="com.nd.desktopcontacts.tmpphone" android:targetActivity="com.nd.desktopcontacts.MainActivity">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.DEFAULT" />            </intent-filter>        </activity-alias>



通过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();          }        }      }    }  }  


可以看到需要一个Action,一个Flag,继续查看反编译的文件找到对应的action,和flag,这次直接跳转成功

      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,



http://download.csdn.net/detail/wds1181977/9364623




0 0
原创粉丝点击