Activity之间的通信与自定义Action
Activity之间的通信
Activity 之间的通信是通过Intent实现的
1.由activity A 到B -- 调用同一个应用下的activity
??? a.普通方式
????流程:创建一个Intent实例 ,通过Intent指定从哪个Activity到哪个Activity,然后 A实例对象.startActivity(Intent实例)??? eg:
??? Intent intent = new Intent(A.this,B.class);
??? 你也可以传参数到目标Activity
??? intent.putExtra("key",value);----有个中重载,如果你要传的值是自己定义的类对象,那么这个类必须实现???????
java.io.Serializable 接口
??? A的实例对象.startActivity(intent);
? b.启动带返回值的Activity
?? 既然能从A传参数到B,肯定也能从B返回数据给A
???流程: 创建一个Intent实例,然后A的实例对象.startActivityForResult(Intent实例,int类型的请求标示);
?? 重写A类的onActivityResult(int requestCode, int resultCode, Intent data) ;
?? 注意:int类型的请求标示必须是唯一的,通常情况下 我们使用布局文件的int表示方式作为请求标示
???eg:
?? //启动 带返回值的activity
?? Intent intent? = new Intent(A.this,B.class);
?? A的实例对象.startActivityForResult(intent, R.layout.main);
?? //在B类中 指定返回值
???Intent intent=B的实例对象.getIntent().putExtra("key","hello");
??? B的实例对象.setResult(20,intent);
?//重写A类的onActivityResult(int requestCode, int resultCode, Intent data)? 接收数据
? ?@Override
?protected void onActivityResult(int requestCode, int resultCode, Intent data) {
??// TODO Auto-generated method stub
??super.onActivityResult(requestCode, resultCode, data);
??
??switch (requestCode) {
??case R.layout.main:
?????? if(requestCode==20)
?????? {
????? ? String resultStr= data.getStringExtra("key");
?????? }
???break;
??default:
???break;
??}
?}
变量resultStr 就是返回值 为 hello;
2.调用不同应用程序的Activity
创建Intent实例时 有很多重载
?public Intent(Context packageContext,Class<?> cls); --- 上面已经使用了
?public? Intent(String action);
?public Intent(String action,Uri uri);
?调用其他应用程序的Activity 就是通过后两种构造实现的 (通过Action 的方式);
a.调用系统的应用程序
???????? android 系统自带很多功能的应用,像打电话,浏览网页,发送Email等。。
????????eg: 打电话
???????? Intent intent = new (Intent.Action_CALL,Uri.parse("tel:"+电话号码));
???????? startActivity(intent);
?b.己的Activity Action? 供别的应用调用
?? 流程:在AndroidManifest.xml 中的被调用的Activity的节点下定义Action ,在调用方使用Intent(String action) 构造调用
?? 注意:两个Activity 可以 属于不同的应用
??? eg :
??? AndroidManifest.xml 中定义 Action
??? ? <activity android:name=".Main"
????????????????? android:label="@string/app_name">
??????????? <intent-filter>
??????????????? <action android:name="com.myaction"/>
??????????? </intent-filter>
??????? </activity>
???? 调用方调用
??? Intent intent = new? Intent("com.myaction");
??? startActivity(intent);
c.用需要传参的其他应用的Activity
????由第三种构造(?public Intent(String action,Uri uri);)? 可以了解我们可以通过Uri对象给被调用的Activity传递参数
??? 分析Uri的格式("tel:12345678")可以发现Uri需要一个头 ("tel"); 这个头在你自定义action 的时候需要自己定义
?? 这个头也是在Androidmanifest.xml 中定义
??? 流程:在AndroidManifest.xml 中的被调用的Activity的节点下定义Action 和Uri头,在调用方使用
Intent(String action,Uri uri);构造调用
???? eg:
??? 在AndroidManifest.xml 中定义Action? 和 Uri头
?? <activity android:name=".Main"
????????????????? android:label="@string/app_name">
??????????? <intent-filter>
??????????????? <action android:name="com.myaction"/>
???????? <!--Uri头-->
?????????????? <data android:scheme="myscheme"></data>
????????? </intent-filter>
??????? </activity>
? 在调用方调用
?? Uri? uri? = Uri.parse("myscheme://哈哈哈");
???Intent???intent = new? Intent("com.myaction",uri);
?? startActivity(intent);
?? 在被调用方的到传过来的参数
?? Uri uri = getIntent().getData();
?? String str= uri.getHost();
??? str变量得到的值就是“哈哈哈”
?
?
??
?
?
???
?
???
???