intent-活动间传递数据

使用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: 最新课程

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注