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變量得到的值就是“哈哈哈”