不同app之间activity的启动调用传值

假设有两个工程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);

      

你可能感兴趣的:(Android-基础)