Android中显示Intent和隐式Intent的使用

Android中显示Intent和隐式Intent的使用

Intent是Android中定义的Java类,它用来实现Activity之间的跳转,跳转的同时可以传送数据。

使用显式的Intent

使用Intent的构造函数:Intent(Conotext packageContext,Class<?> cls)来创建一个Intent,这个构造函数的第一个参数要求一个启动活动的上下文,第二个参数Class则是指定想要启动的目标活动。单词Intent意思是“意图”。

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

使用这种方式启动另一个活动,“意图”很明显,我们称为显式Intent

使用隐式的Intent

含蓄,不指名道姓,不会指明那个Activity必须被哪个Activity所启动。
一个Activity2如何被另一个Activity1所启动,关键取决于AndroidManifest.xml中对于Activity2定义的两个标签的信息,分别是action和category。

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

然后使用另一个的构造函数Intent(String str)来创建隐式的Intent:

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

以上代码创建的Intent对象,用它启动Activity,启动的是能够响应"android.bignerdranch.activitytest.ACTION_START"这个action的活动,由于SecondActivity的category指定为默认,因此是可以匹配的,可以成功启动SecondActivity。
【注意】:每个Intent只能指定一个action,但却能指定多个category。
如果intent对象中多指定一个category,那么,这个intent就无法启动SecondActivity了:

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

这样一来,使用startActivity(intent)启动一个Activity,没有一个Activity与它匹配,程序就会闪退。
出现运行时异常:android.content.ActivityNotFoundException:No Activity found to handle Intent
解决异常:在安卓总配置文件的<intent-filter>标签中再添加一个category声明:

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

隐式Intent:打开网页

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

通过调用Uri.parse()方法,将一个网址的字符串解析成一个Uri对象,再调用Intent的setData()方法将这个Uri对象传递进去。
我们还可以在<intent-filter标签中再配置一个<data>标签,用于更精确的响应当前活动能够响应什么类型的数据。
<data>标签中可配置的内容如下:

  • android:scheme 用于指定数据的协议部分,如”http“。
  • android:host 用于指定数据的主机名部分,如”www.baidu.com“。
  • android:port 用于指定数据的端口号,一般紧随在主机名之后。
  • android:path 用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容。
  • android:memeType 用于指定可以处理的数据类型,允许使用通配符的方式进行指定。

隐式Intent:拨打电话

 button1.setOnClickListener(new View.OnClickListener(){
     @Override
     public void onClick(View v) {
         Intent intent = new Intent(Intent.ACTION_DIAL);
         intent.setData(Uri.parse("tel:1008611"));
         startActivity(intent);
     }
 });

隐式Intent:应用之间传递数据

向下一个应用传递数据

 button1.setOnClickListener(new View.OnClickListener(){
     @Override
     public void onClick(View v) {
     	 String data = "你好呀,SecondActivity";
         Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
         intent.putExtra("extra_data",data);//第一个参数是键,第二个参数才是真正的数据
         startActivity(intent);
     }
 });

在SecondActivity重写的onCreate方法中,加入如下代码:

 @Override
 protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.second_layout);
     Intent intent = getIntent();//注意这里是getIntent()
     String data = intent.getStringExtra("extra_data");
     Log.d("SecondActivity",data);
//····
 }

返回数据给上一个活动

 button1.setOnClickListener(new View.OnClickListener(){
     @Override
     public void onClick(View v) {
         Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
         startActivityForResult(intent,1);
     }
 });
Button button2 = (Button)findViewById(R.id.button_2);
button2.setOnClickListener(new View.OnClickListener(){
    @Override
    public void onClick(View v) {
        Intent intent = new Intent();
        intent.putExtra("data_return","你好呀 FirstActivity");
        setResult(RESULT_OK,intent);
        finish();
    }
});

在FirstActivity中重写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:
    }
    super.onActivityResult(requestCode, resultCode, data);
}

如果用户不是通过点击button 2按钮返回到FirstActivity,而是通过按下手机的Back键回到FirstActivity,这个时候我们就要监听Back键来发送数据给上层应用了:

    @Override
    public void onBackPressed(){
        Intent intent = new Intent();
        intent.putExtra("data_return","你好呀,,,FirstActivity");
        setResult(RESULT_OK,intent);
        finish();
    }
发布了68 篇原创文章 · 获赞 57 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43598138/article/details/104824997