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



举个栗子我要启动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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值