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

發佈了59 篇原創文章 · 獲贊 15 · 訪問量 38萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章