假设有两个工程Aproduct 和 Bprodcut
一:现在打开A工程中的activity点击某按钮启动B工程中的actvity(先不传递值,只启动)
B工程AndroidManifest.xml配置
<activity android:name=".MainActivity">
//第一个intent-filter默认程序启动入口
<intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> intent-filter>
//第二个intent-filter程序的第二个入口 名字为 net.action.b.main <intent-filter> <action android:name="net.action.b.main" /> <category android:name="android.intent.category.DEFAULT" /> intent-filter> activity>
A工程启动B工程的方法为:
Intent intent = new Intent("net.action.b.main");
//调用A中的Main startActivity(intent);
A工程启动B工程的actvity,不论B工程当前是否在运行都会启动。
当然如果B工程这个页面根本不存在程序就会出ActivityNotFoundException异常然后崩掉,
所以开发中需要捕获这个Exception不要让程序挂掉,然后根据需求做一些处理:
try{
Intent intent = new Intent("net.action.a.main"); //调用A中的Main startActivity(intent); }catch (ActivityNotFoundException e){ Toast.makeText(MainActivity.this,"我在这崩溃了,需要处理",Toast.LENGTH_SHORT).show(); }
二:现在A工程启动B工程需要传值了
正常的Intent携带的参数正常使用就好,比如 intent.putExtra("value","key")等等
但是如果在B工程的配置不是不是不是
//第二个intent-filter程序的第二个入口 名字为 net.action.b.main <intent-filter> <action android:name="net.action.b.main" /> <category android:name="android.intent.category.DEFAULT" /> intent-filter>
而是而是而是加了一个scheme属性值,变成这样:
//第二个intent-filter程序的第二个入口 名字为 net.action.b.main <intent-filter> <action android:name="net.action.b.main" />
< category android :name= "android.intent.category.DEFAULT" /> intent-filter>
那么A工程启动B工程就需要这样启动了try {
Intent intent = new Intent("net.action.a.main",Uri.parse("bbb://666")); //调用A中的Main startActivity(intent); }catch (ActivityNotFoundException e){ Toast.makeText(MainActivity.this,"我在这崩溃了,需要处理",Toast.LENGTH_SHORT).show(); }
必须加Uri.parse("xxx://?????")
那么在B中获取A在uri.parse传递过去的方式为:获取的是xxx://后边的内容 也就是666
String host = getIntent().getData().getHost();
三:当然以上是action的启动方式 还有一种就是直接以包名 类全名启动的方式
Intent intent=new Intent();
方式一:setClassName
intent.setClassName("启动目标包名,比如:com.xxx.a","启动目标类名,比如:com.xxx.a.XxxActivity")
方式二:setComponent
intent.setComponent(new ComponentName("启动目标包名,比如:com.xxx.a",
"启动目标类名,比如:com.xxx.a.XxxActiviy"));
注:app之间启动切换actvity启动方式既可以是startActivity(intent)也可以是startActivityForResult(intent,66);