第一种跳转方式 ,简单跳转
发送:
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);
}