在App A中调用App B的Activity1。需要做两方面的配置。
(1)App B要表明,Activity1是对外可见的,或是可以被启动的Activity.
可在AndroidManifest.xml文件中做相应修改
<activity
android:name=".Activity1"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>//声明为入口Activity
</intent-filter>
</activity>
或
<activity
android:name=".ui.ScanActivity"
android:screenOrientation="portrait"
android:exported="true">//声明对外可见
</activity>
若不做相关声明,直接从外界调用,则会报错
FATAL EXCEPTION: main
Process: com.breakloop.openAppBActivity, PID: 10700
java.lang.SecurityException: Permission Denial: starting Intent { cmp=com.demo.app/.Activity1 } from ProcessRecord{1d7d3fd 10700:com.breakloop.opencep/u0a138} (pid=10700, uid=10138) not exported from uid 11385
(2)App A要知道App B的package Name。当然,如果App B的Activity1 不是APP启动的首选入口Activity,即无“android.intent.category.LAUNCHER”属性,还需要知道Activity1的名称。
String mPackageName="com.demo.app";
String mActivityName="com.demo.app.Activity1";
Intent intent=new Intent();
intent.setComponent(new ComponentName(mPackageName,mActivityName));
startActivityForResult(intent,1);
这里,附上对android.intent.action.MAIN和android.intent.category.LAUNCHER的简单理解。
(a)android.intent.action.MAIN,表明该Activity可以作为APP入口启动。一个APP可以有多个入口,例如微信的主界面(用户点击进入),和微信的支付界面(第三方调用进入)
(b)android.intent.category.LAUNCHER,表明该Activity可在桌面显示(点击APP图标所触发的Activity)
如果对两属性比较感兴趣,可以参见博主Lindroy的文章。其中对该两属性进行了配置实验。
http://blog.csdn.net/lindroid20/article/details/51993247