第一種跳轉方式 ,簡單跳轉
發送:
Intent intent = new Intent(ActivityA.this, ActivityB.class);
startActivity(intent);
第二種跳轉方式,帶數據跳轉:
1.攜帶一些附加信息鍵值對
2.通過使用putextra()方法添加數據,使用getXXXExtra()方法獲取數據
3.複雜數據實現Parcelable接口或者Serializable接口來傳遞
Intent intent = new Intent(ActivityA.this, ActivityB.class);
intent.putExtra("Message", "This message from Activity A!");//鍵值對方式
startActivity(intent);
接收方:
Intent intent = getIntent();
String msg = intent.getStringExtra("Message");
待返回值跳轉:
發送方:
Intent intent = new Intent();
intent.setClass(ActivityA.this, ActivityB.class);
startActivityForResult(intent, REQUEST_CODE);
重寫onActivityResult方法
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.i(TAG, "onActivityResult");
if(requestCode == REQUEST_CODE) {
switch (resultCode) {
case RESULT_OK: {
}
break;
}
}
}
接收方:
Intent intent = new Intent();
intent.putExtra("Message", "This message return from Activity B!");
setResult(RESULT_OK, intent);
finish();
Intent的標誌位 Flag
Intent指定Activity的啓動方式:設置intent的Flags來指定Activity的啓動方式,這裏有兩種介紹一下
1.FLAG_ACTIVITY_NEW_TASK
如果intent設置的flag對應跳轉的activity的任務棧沒有指定新的任務棧,則新啓動的Activity進入棧頂,如果
對應跳轉的activity的指定了別的任務棧,則該activity啓動後處在新的任務棧;
<!--<activity android:name=".ActivityC" />-->//不會新建任務棧
<activity
android:name=".ActivityC"
android:taskAffinity="com.netease.study.intent.ActivityB"/>//會新建任務棧
新建任務棧下的adb命令行下的棧如下:
Running activities (most recent first):
TaskRecord{533b88c4 #22 A com.netease.study.intent.ActivityB U 0}
Run #6: ActivityRecord{533a9b20 u0 com.netease.study.intent/.ActivityC}
TaskRecord{5335a8a8 #21 A com.netease.study.intent U 0}
Run #5: ActivityRecord{53310730 u0 com.netease.study.intent/.ActivityB}
Run #4: ActivityRecord{5330d9d4 u0 com.netease.study.intent/.ActivityA}
2.FLAG_ACTIVITY_SINGLE_TOP
這個和activity的啓動方式很像,如果當前activity處於棧頂則不新建activity,
如果該activity應啓動,不處於棧頂,則會新建一個該活動
如果ActivityC 第一次啓動則:
Running activities (most recent first):
TaskRecord{5332e528 #23 A com.netease.study.intent U 0}
Run #6: ActivityRecord{5336f83c u0 com.netease.study.intent/.ActivityC}
Run #5: ActivityRecord{534c06bc u0 com.netease.study.intent/.ActivityB}
Run #4: ActivityRecord{532e5f60 u0 com.netease.study.intent/.ActivityA}
如果此時ta已在棧頂:
Running activities (most recent first):
TaskRecord{5332e528 #23 A com.netease.study.intent U 0}
Run #6: ActivityRecord{5336f83c u0 com.netease.study.intent/.ActivityC}
Run #5: ActivityRecord{534c06bc u0 com.netease.study.intent/.ActivityB}
Run #4: ActivityRecord{532e5f60 u0 com.netease.study.intent/.ActivityA}
此時 c調用的是 onNewIntent方法 !
public void startActivityC(View v) {
Intent intent = new Intent();
intent.setClass(this, ActivityC.class);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
}
3.FLAG_ACTIVITY_CLEAR_TOP
這個和activity的singletask很相像,當activity已經處於棧中,但不處於棧頂,這個時候,如果該activity啓動
則會把處在該activity前的activity給clear掉
第三種,指定組件跳轉:
例如:
Intent intent = new Intent();
intent.setAction(Intent.ACTION_DIAL);
intent.addCategory(Intent.CATEGORY_DEFAULT);
startActivity(intent);
Intent intent = new Intent();
intent.setAction(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:1320010001"));
startActivity(intent);
不指定組件跳轉:隱式跳轉
需要在清單文件中進行:
<activity android:name=".ShareActivity">
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/plain"/>
<!--<data android:mimeType="image/*"/>-->
<!--<data android:mimeType="audio/*"/>-->
<!--<data android:mimeType="video/*"/>-->
</intent-filter>
</activity>
然後在Activity中
public void shareTextContent(View v) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_TEXT, "This is my text to send.");
intent.setType("text/plain");
startActivity(intent);
}