Android:使用 Intent 鏈接多個活動

Intent是Android各組件之間進行交互的一種重要方式,通常被用於啓動活動、啓動服務以及發送廣播等場景。android

顯式Intent:

Intent有多個構造函數重載,其中一個Intent(Context packageContext,Class cls)。第一個參數要求提供一個啓動活動的上下文,第二個參數是指向想要啓動的目標活動。建立好Intent後,用**startActivity()**方法啓動便可。瀏覽器

以下,在 MainActivity 中的一個按鈕的點擊後,啓動 first_activitybash

public void onClick(View v) {
     Intent intent = new Intent(MainActivity.this,first_activity.class);
     startActivity(intent);
}
複製代碼

隱式 Intent:

隱式 Intent不像顯式那樣明確指出要啓動哪個活動,而是指定一系列更爲抽象的actioncategory等信息,只有當actioncategory信息徹底匹配時才能成功啓動。app

首先在AndroidManifest.xml中的 ****標籤下配置 ****內容,以下:ide

<activity android:name=".second_activity" >
      <intent-filter>
           <action android:name="com.lodge.myapplication.ACTION_START" />
           <category android:name="android.intent.category.DEFAULT" />
      </intent-filter>
</activity>
複製代碼

其中 標籤中指明活動能夠響應com.lodge.myapplication.ACTION_START 。而後在另外一個 activity中按鈕的點擊事件添加以下代碼:函數

button_2.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View v) {
         Intent intent = new Intent("com.lodge.myapplication.ACTION_START");     //隱式Intent;
         startActivity(intent);
     }
});
複製代碼

這裏的 intent是另外一個構造函數,直接將action的字符串傳了進去,表示想要啓動可以響應com.lodge.myapplication.ACTION_START這個 action的活動。另外,由於category參數設置爲android.intent.category.DEFAULT ,表明默認設置,因此在intent中未加入category。 其實每一個intent中只能指定一個action,但卻能指定多個category。例如:ui

button_2.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View v) {
        Intent intent = new Intent("com.lodge.myapplication.ACTION_START");     //隱式Intent;
        intent.addCategory("com.lodge.myapplication.MY_CATEGORY");
        startActivity(intent);
     }
});
複製代碼

固然,在AndroidManifest.xml中****標籤下的 ****裏也要添加 內容,以下:this

<activity android:name=".second_activity" >
     <intent-filter>
         <action android:name="com.lodge.myapplication.ACTION_START" />
         <category android:name="android.intent.category.DEFAULT" />
         <category android:name="com.lodge.myapplication.MY_CATEGORY" />
     </intent-filter>
</activity>
複製代碼

更多隱式intent:

使用隱式intent啓動其餘程序的活動。例如打開系統瀏覽器,在按鈕點擊事件中添加以下代碼:spa

button_3.setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View v) {
           Intent intent = new Intent(Intent.ACTION_VIEW);             //更多隱式Intent;
           intent.setData(Uri.parse("http://www.baidu.com"));
           startActivity(intent);
       }
});
複製代碼

這裏的Intent.ACTION_VIEW是內置動做。code

向下一個活動傳遞數據:

Intent中的putExtra()方法能夠把咱們想要傳遞的數據保存在Intent中,啓動另外一個活動後,再把數據從Intent中取出便可。

//上一個活動傳送數據;
button.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
          String data = "hello intent put_Extra";
          Intent intent = new Intent(MainActivity.this,first_activity.class);
          intent.putExtra("extra_data",data);     //傳遞數據,第一個參數是鍵值,後一個參數是要傳遞的數據;
         startActivity(intent);
     }
});
 
//下一個活動獲取數據;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_first);
 
    Intent intent = getIntent();        //獲取用於啓動本activity的intent;
    String data = intent.getStringExtra("extra_data");      //傳入相應鍵值,得到數據;
    Log.d("first_activity",data);       //打印數據;
}
複製代碼

返回數據給上一個活動:

Activity中有一個**startActivityForResult()**方法也是用於啓動活動的,可是這個方法指望在活動銷燬的時候可以返回一個結果給上一個活動。

//啓動活動;
button.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
          Intent intent = new Intent(MainActivity.this,second_activity.class);
          startActivityForResult(intent,1);    //接收啓動的下一個活動返回的數據,第二個參數是請求碼,只要是惟一值就行,這裏是 1 ;
      }
});
 
@Override
//重寫onActivityResult()方法,用於響應startActivityForResult()方法啓動的活動;
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    switch (requestCode)
    {
        case 1:
           if(resultCode == RESULT_OK)
           {
                String returnedData = data.getStringExtra("return_data");
                Log.d("main_activity",returnedData);
           }
           break;
    }
}
 
 
//子活動設置按鈕銷燬活動(return_button) ;
@Override
protected void onCreate(Bundle savedInstanceState) { 
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_second);
 
   Button button = findViewById(R.id.return_button);
 
   button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent();
            intent.putExtra("return_data","hello main_activity!");
            setResult(RESULT_OK,intent);
            finish();       //銷燬當前活動;
        }
    });
}
 
 
@Override
//重寫按下返回鍵的方法,實現與 return_button 相同的功能;
public void onBackPressed() {
    Intent intent = new Intent();
    intent.putExtra("return_data","hello back to main_activity!");
    setResult(RESULT_OK,intent)
    finish();       //銷燬當前活動;
}
複製代碼
相關文章
相關標籤/搜索