码迷,mamicode.com
首页 > 移动开发 > 详细

安卓学习之Intent

时间:2016-08-22 13:51:52      阅读:224      评论:0      收藏:0      [点我收藏+]

标签:

什么是Intent

        对于一个应用,他会有多个活动,活动之间的跳转数据传递可以通过Intent来实现。Intent 是 Android 程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据。Intent 一般可被用于启动活动、启动服务、以及发送广播等场景。

使用Intent

使用显式Intent

        对现在修改FirstActivity中按钮的点击事件,代码如下:

button1.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
        startActivity(intent);
    }
});  

  首先我们新建了一个Intent,传入FirstActivity.this,作为上下文,传入Second.class作为目标活动,这样我们的意图就是就在FirstActivity这个活动中点击button然后打开SecondActivity这个活动,然后通过startActivity()方法来执行这个Intent。
        对这种方式的Intent意图很明显,所以称为显式Intent。

使用隐式Intent

        相比于显式 Intent,隐式 Intent 则含蓄了许多,它并不明确指出我们想要启动哪一个活动,而是指定了一系列更为抽象的 action 和 category 等信息,然后交由系统去分析这个 Intent。
        通过在标签下配置的内容,可以指定当前活动能够响应的action和 category,打开 AndroidManifest.xml,添加如下代码:

<activity android:name=".SecondActivity" >
    <intent-filter>
        <action android:name="com.example.activitytest.ACTION_START" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>  

  action标签中我们指明了活动SecondActivity可以响应com.example.activitytest.ACTION_START这个action,而category标签包含了附加信息(注意,action只能有一个,category可以有多个),更加精确指明了当前活动响应哪一个Intent。只有actioncategory中的内容同时能够匹配上Intent中指定的action和category时,这个活动才能响应Intent。
         修改FirstActivity中按钮的点击事件代码如下所示:

button1.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent("com.example.activitytest.ACTION_START");
        startActivity(intent);
    }
});  

  这里我们指定了action为com.example.activitytest.ACTION_START,但是我们并没有指定category。因为android.intent.category.DEFAULT是一种默认的category,我们在AndroidManifest.xml中代码如下所示:

 

<activity android:name=".SecondActivity">
    <intent-filter>
        <action android:name="com.example.activitytest.ACTION_START" />
        <category android:name="android.intent.category.DEFAULT"/>
        <category android:name="com.example.activitytest.MY_CATEGORY"/>
    </intent-filter>        
</activity>  

        所以虽然我们在FirstActivity按钮点击事件代码里没有指定category,但是我们在.xml文件中注册了默认的category,所以会响应这个活动。

更多隐式Intent的用法

         使用隐式Intent,我们不仅可以启动自己程序内的活动,还可以启动其他程序的活动。这使得多个程序间的功能共享成为可能。
        现在修改FirstActivity中按钮点击事件代码,如下所示:

button1.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setData(Uri.parse("http://www.baidu.com"));
        startActivity(intent);
    }
});  

  这里我们指定了Intent的action为Intent.ACTION_VIEW,这是android系统内置的动作,常量值为android.intent.action.VIEW。通过Uri.parse()方法,可以将一个网址的字符串解析成为一个Uri对象,在调用Intent的setData()方法,将这个Uri对象传入。
         点击button会打开自带的浏览器访问百度。
        当然我们也可以在intent-filter标签中配置data标签,用于指定当前活动能够响应什么类型的数据。现在我们新建一个布局和活动,并且他的注册时data标签指定为http协议。那么当我们有一个事件他的action和category和我们新建的对应,并且事件协议是http,那么我们也会响应这个活动。
        除了http协议外,还有geo表示地理位置,tel表示拨打电话等。

向下一个活动传递数据

        之前都是关于Intent启动活动,Intent还可以启动活动的时候传递数据。
        Intent 中提供了一系列 putExtra()方法的重载,可以把我们想要传递的数据暂存在 Intent 中,启动了另一个活动后,只需要把这些数据再从Intent 中取出就可以了。
        现在在FirstActivity活动中有一个字符串,现在要把这个字符串传递到SecondActivity中,FirstActivity代码如下:

button1.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        String data = "Hello SecondActivity";
        Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
        intent.putExtra("extra_data", data);
        startActivity(intent);
    }
});  

        这里我们用显示的方式启动SecondActivity,通过putExtra()方法传递一个字符串。putExtra()方法中第一个参数为键,第二个为值。
        在SecondActivity中获取传递过来的值: 

public class SecondActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.second_layout);
        Intent intent = getIntent();
        String data = intent.getStringExtra("extra_data");
        Log.d("SecondActivity", data);
    }
}  

  getIntent()方法可以活动启动当前活动的Intent,然后调用getStringExtra()方法来获取数据。如果传递过来的值为整型,那么用getIntExtra(),其余类型类似。

返回数据给上一个活动

        我们可以传递数据给下一个活动那么我们当然可以返回数据给上一个活动。
        Activity 中还有一个 startActivityForResult()方法也是用于启动活动的,但这个方法期望在活动销毁的时候能够返回一个结果给上一个活动。
        startActivityForResult()方法也是用于启动活动的,但这个方法期望在活动销毁的时候能够返回一个结果给上一个活动。第二个参数是请求码,SecondActivity活动销毁后会回调当前活动的onActivityResult()方法,该方法第一个参数就是指定了这个请求码。
        我们修改FirstActivity中按钮的点击事件,代码如下所示:

button1.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
        startActivityForResult(intent, 1);
    }
});  

   接下来我们在SecondActivity 中给按钮注册点击事件,并在点击事件中添加返回数据的逻辑,代码如下所示:  

 

public class SecondActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.second_layout);
        Button button2 = (Button) findViewById(R.id.button_2);
        button2.setOnClickListener(new OnClickListener() {
          @Override
          public void onClick(View v) {
              Intent intent = new Intent();
              intent.putExtra("data_return", "Hello FirstActivity");
              setResult(RESULT_OK, intent);
              finish();
          }
        });
    }
}  

  这里我们new了一个Intent,但是没有指定任何意图,因为这个Intent仅仅用于传递数据。这里调用了setResult()方法,这个方法是用于向上一个活动返回数据的。它有2个参数,第一个参数用于向上一个活动返回处理结果, 一般只使用RESULT_OK 或 RESULT_CANCELED 这两个值;第二个参数则是把带有数据的 Intent 传递回去。
        因为我们使用了startActivityForResult()方法来启动当前活动,所以当前活动销毁后,会回调上一个活动的onActivityResult()方法,因此我们需要写如下代码:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
        case 1:
        if (resultCode == RESULT_OK) {
            String returnedData = data.getStringExtra("data_return");
            Log.d("FirstActivity", returnedData);
        }
        break;
        default:
    }
}  

  该方法有3个参数,第一个参数表示请求码,可能有多个返回的数据,请求码就可以一一对应,第二个参数是返回数据时候的处理结果,是RESULT_OK或者RESULT_CANCELED,第三个参数就是带有数据的Intent。

        如果用户在 SecondActivity 中并不是通过点击按钮,而是通过按下Back 键回到 FirstActivity,我们可以通过重写 onBackPressed()方法来解决这个问题,代码如下所示:

 

@Override
public void onBackPressed() {
    Intent intent = new Intent();
    intent.putExtra("data_return", "Hello FirstActivity");
    setResult(RESULT_OK, intent);
    finish();
}  

        这样的话,当用户按下 Back 键,就会去执行 onBackPressed()方法中的代码,效果和之前点击button是一样的。

        到这里学习了Intent。

安卓学习之Intent

标签:

原文地址:http://www.cnblogs.com/sweat123/p/5795265.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!