使用intent在活动之间穿梭
从主活动跳到其他的活动
使用显式Intent
我们添加一个空的活动 然后我们给活动起名叫AddCourseActicity 勾选生成布局文件。
不过不要勾选Launcher activity选项
Intent
Intent是安卓程序中各组件之间进行交互的一种重要方式。
它不仅可以指明当前组件想要执行的动作。还可以在不同组件之间传递数据。
Intent分为:显式Intent和隐式Intent
它有多个构造函数
我在主活动的按钮上面 实例化一个Intent 然后从主活动跳到第二个活动
//先初始化一个Intent 从哪里到哪里
Intent it = new Intent(FirstActivity.this,AddCourseActicity.class);
startActivity(it);Code language: JavaScript (javascript)
隐式Intent的使用
相比显式Intent,隐式Intent不需要指明启动那个活动。而是指定一系列更抽象的action和category
然后让系统分析这个Intent 并帮我们找出合法的启动
我们修改AndroidManifest.xml
给第二个活动添加action和category
action 我们指明我们的这个活动可以响应这个action
<activity android:name=".AddCourseActicity">
<intent-filter>
<action android:name="com.foxdevelop.www.activitydemo.ACTION_START" />
<category android:name="android.intent.category. DEFAULT" />
</intent-filter>
</activity>Code language: HTML, XML (xml)
只有Intent中能够匹配活动的action和category
这个活动才能响应Intent
//先初始化一个Intent 让它去匹配AndroidManifest.xml中的对应下面的action
Intent it = new Intent("com.foxdevelop.www.activitydemo.ACTION_START");
startActivity(it);Code language: JavaScript (javascript)
为什么不需要匹配category
因为我们的这个活动 是使用android.intent.category.DEFAULT的
这是一个默认
当我们调用startActivity的时候 自动传入DEFAULT
每个Intent只能指定一个action 却可以指定多个category
目前是DEFAULT 我们可以不用添加
如果我们需要添加其他的category
//先初始化一个Intent 让它去匹配AndroidManifest.xml中的对应下面的action 同时加入category
Intent it = new Intent("com.foxdevelop.www.activitydemo.ACTION_START");
it.addCategory("com.foxdevelop.www.activitydemo.MY_CATEGORY");
it.addCategory("com.foxdevelop.www.activitydemo.MY_CATEGORY1111111");
startActivity(it);Code language: JavaScript (javascript)
点击添加课程菜单 发现程序出错了
原因是我们给intent增加了一个category 但是我们的第二个活动 却没有这个category
所以我们需要增加这个category
<activity android:name=".AddCourseActicity">
<intent-filter>
<action android:name="com.foxdevelop.www.activitydemo.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="com.foxdevelop.www.activitydemo.MY_CATEGORY" />
</intent-filter>
</activity>Code language: HTML, XML (xml)
注意
我们的intent如果有多个category 那么并不是说 满足一个category就可以 而是所有的category都要匹配上 才可以。
<activity android:name=".AddCourseActicity">
<intent-filter>
<action android:name="com.foxdevelop.www.activitydemo.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="com.foxdevelop.www.activitydemo.MY_CATEGORY" />
</intent-filter>
</activity>Code language: HTML, XML (xml)
case R.id.add:
//先初始化一个Intent 让它去匹配AndroidManifest.xml中的对应下面的action 同时加入category
Intent it = new Intent("com.foxdevelop.www.activitydemo.ACTION_START");
it.addCategory("com.foxdevelop.www.activitydemo.MY_CATEGORY2222222");
//it.addCategory("android.intent.category.DEFAULT");
startActivity(it);
break;Code language: JavaScript (javascript)
隐式Intent打开网页
使用隐式Intent还有很多功能可以实现的
不仅仅可以启动同一个程序的活动,还可以启动其他程序的活动。
这样多个应用程序之间功能共享称为可能。
比如我们的微信聊天,朋友发你一个地址的时候,你可以使用QQ浏览器打开
下面我们就来试一下
Intent it = new Intent(Intent.ACTION_VIEW);//系统内置的Action
it.setData(Uri.parse("http://www.foxdevelop.com"));//打开一个网址
startActivity(it);Code language: JavaScript (javascript)
http://这个不能少 否则报错
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.foxdevelop.www.activitydemo, PID: 8917
android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=www.foxdevelop.com }
at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1809)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1523)
at android.app.Activity.startActivityForResult(Activity.java:4224)
at android.support.v4.app.BaseFragmentActivityApi16.startActivityForResult(BaseFragmentActivityApi16.java:54)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:68)Code language: PHP (php)
隐式Intent打电话
可以调用tel协议 来打电话的
我们上节课使用http协议 打开域名
比如我们下面 尝试拨打电话10010

Intent it = new Intent(Intent.ACTION_DIAL);//系统内置的Action
it.setData(Uri.parse("tel:10010"));//拨打这个电话 需要用户确认拨打
startActivity(it);Code language: JavaScript (javascript)
活动之间传递数据
Intent可以传递数据
intent 英[ɪnˈtent] 美[ɪnˈtɛnt] 意图,目的; 意思,含义;
使用它的putExtra方法 可以传递数据
然后在第二个活动中 通过调用 getStringExtra方法可以获得传过来的数据
在第二个活动中 可以调用getIntent方法获取Intent
当然如果是传递的是整数 可以使用getIntExtra方法获得
首先在第一个活动里面
Intent it = new Intent(FirstActivity.this,AddCourseActicity.class);
it.putExtra("site","www.foxdevelop.com");
it.putExtra("name","FoxDevelop");
startActivity(it);Code language: JavaScript (javascript)
然后第二个活动 获取Intent对象然后就可以获取它里面的值。
在第二个活动的onCreate方法里面
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_course_acticity);
Intent it = getIntent();
String site = it.getStringExtra("site");
String name = it.getStringExtra("name");
int version = it.getIntExtra("version", 1);
Log.e(TAG, site);
}Code language: JavaScript (javascript)
返回数据给前一个活动
当我们退出当前活动的时候
我们在活动中有一个startActivityForResult方法 可以在销毁活动之前返回一个结果给上一个活动。
该方法接收两个参数 第一个是Intent 第二个是请求码,用户在之后的回调中判断数据的来源。
在活动销毁之前 使用setResult方法 可以向上一个活动返回结果。一般使用RESULT_OK或RESULT_CANCELED 第二个参数则是吧带数据的Intent传回去
我们可以给Intent使用putExtra设置值。
由于我们在上一个活动中使用了startActivityForResult 来启动第二个活动 所以当第二个活动销毁后 会触发第一个活动的
onActivityResult方法。在这里 我们可以获得Intent 和获得结果编码
如果用户不是点击按钮退回的 而是使用back键退回 这个时候 我们需要重写第二个活动的onBackPressed方法才可以
1 在第一活动启动Intent的时候
Intent it = new Intent(FirstActivity.this,AddCourseActicity.class);
it.putExtra("site","www.foxdevelop.com");
it.putExtra("name","FoxDevelop");
it.putExtra("version",1);
startActivityForResult(it,1);Code language: JavaScript (javascript)
2 第一个活动中 重写
public class FirstActivity extends AppCompatActivity {
private static final String TAG = "FirstActivity";
//重写第一个活动的方法 当第二个活动退出 就会执行这里的代码
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode==RESULT_OK)
{
String h = data.getStringExtra("hot");
Log.d(TAG, h);
}
super.onActivityResult(requestCode, resultCode, data);
}Code language: JavaScript (javascript)
3 在第二个活动中
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_course_acticity);
//获取上一个活动的数据
Intent it = getIntent();
String site = it.getStringExtra("site");
String name = it.getStringExtra("name");
int version = it.getIntExtra("version", 1);
Log.e(TAG, site);
//给按钮添加退回事件 然后在事件里面 给Intent赋值 然后设置结果编码 同时退出finish
Button b = findViewById(R.id.button);
b.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view)
{
Intent it = getIntent();
it.putExtra("hot","热门课程");
setResult(RESULT_OK,it);
finish();
}
});
}Code language: JavaScript (javascript)
当我们退回到主活动的时候 就会触发事件 然后输出日志
05-12 06:17:46.741 12960-12960/com.foxdevelop.www.activitydemo D/FirstActivity: 热门课程
如果想要退出键也能返回数据则
需要重写onBackPressed
我们在第二个活动中 重写
//这个方法是当我们按退出键的时候触发
@Override
public void onBackPressed() {
Intent it = getIntent();
it.putExtra("hot","最新课程");
setResult(RESULT_OK,it);
finish();
}Code language: JavaScript (javascript)
05-12 06:23:08.654 13209-13209/com.foxdevelop.www.activitydemo D/FirstActivity: 热门课程
05-12 06:23:16.405 13209-13209/com.foxdevelop.www.activitydemo D/FirstActivity: 最新课程
05-12 06:23:35.612 13209-13209/com.foxdevelop.www.activitydemo D/FirstActivity: 最新课程