Android学习笔记----Intent基本用法

本文详细介绍了Android中的Intent机制,包括显式意图与隐式意图的使用方法,如何通过Intent在Activity间传递数据,以及如何正确处理返回数据。此外,还探讨了如何利用<intent-filter>标签精确匹配Intent中的action、category和data。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Intent 意图 , 描述一个动作, 激活一个组件 


显示意图   必须要知道被激活的组件的包名和 class的名字

  第一种写法
     
Intent intent = new Intent();
intent.setClassName("cn.itcast.mutileactivity", "cn.itcast.mutileactivity.Demo2Activity");

  第二种写法
     
   
Intent intent = new Intent(this,Demo2Activity.class);

     
  第三种写法
   
  
Intent intent = new Intent();
ComponentName  component = new ComponentName("cn.itcast.mutileactivity", "cn.itcast.mutileactivity.Demo2Activity");
intent.setComponent(component);
。。。。。。。。。。。。。


public Intent setClassName (String packageName, String className)

packageName  要启动的组件所在的应用程序的包名

className        要启动的Acticity或者其他组件的名称

隐式意图

<activity
    android:name=".activity.ChooseAreaActivity"
    android:label="@string/title_activity_choose_area" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
       <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>


<action>     标签中我们指明了当前活动可以响应 com.example.activitytest.ACTION_START 这个 action
<category>标签则包含了一些附加信息,更精确地指明了当前的活动能够响应的 Intent 中还可能带有的 category

只有<action>和<category>中的内容同时能够匹  配上 Intent 中指定的 action 和 category 时,这个活动才能响应该 Intent

Intent intent = new Intent("android.intent.action.MAIN"); 
startActivity(intent);

android.intent.category.DEFAULT 是一种默认的 category,在调用startActivity()方法的时候会自动将这个 category 添加到 Intent 中,所以没有调用addCategory("android.intent.category.DEFAULT "),也可以启动活动。


注意:每个 Intent 中只能指定一个 action,但却能指定多个 category。


还可以在<intent-filter>标签中再配置一个 <data>标签 ,用于更精确地指定当前活动能够响应什么类型的数据。 

<data>标签中主要可以配置以下内容。
 1. android:scheme        用于指定数据的协议部分,如上例中的 http 部分。
 2. android:host              用于指定数据的主机名部分,如上例中的 www.baidu.com 部分。
 3. android:port              用于指定数据的端口部分,一般紧随在主机名之后。
 4. android:path              用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容。
 5. android:mimeType   用于指定可以处理的数据类型,允许使用通配符的方式进行指定。

只有<data>标签中指定的内容和 Intent 中携带的 Data 完全一致时,当前活动才能够响应该 Intent。不过一般在<data>标签中都不会指定过多的内容,如浏览器示例,只需要指定 android:scheme 为 http,就可以响应所有的 http 协议的 Intent 了。

<activity
    android:name=".activity.ChooseAreaActivity"
    android:label="@string/title_activity_choose_area" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
       <category android:name="android.intent.category.DEFAULT" />
        <data android:scheme="haha" android:host="cn.itcast.demo"  />
    </intent-filter>
</activity>

Intent intent = new Intent("android.intent.action.MAIN"); 
intent.setData(Uri.parse("haha://cn.itcast.demo"));
startActivity(intent);

例子:程序中调用浏览器,代码如下:

 Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://163.com")); 
 startActivity(intent); 

或者

 Intent intent = new Intent(Intent.ACTION_VIEW); 
 intent.setData(Uri.parse("http://163.com"));
 startActivity(intent); 


打开图库

Intent intent = new Intent();
intent.setAction(Intent.ACTION_PICK);
intent.setType("image/jpeg");


/************************************************************/

Activity间传递数据

传递单个数据
    主Activity

     Intent data = new Intent("","");
     data.putExtra("name", name);
     startActivity(data);

    被激活的Activity

    Intent data = getIntent();
    String name = data.getStringExtra("name","");

传递多个数据
    主Activity
   
    Intent data = new Intent("","");
    Bundle bundle = new Bundle();
    bundle.putString("name","zhangsan");
    bundle.putString("sex","nan");
    data.putExtras(bundle);
    startActivity(data);

   被激活的Activity

    Intent data = getIntent();
    Bundle bundle = data.getExtras();
    String name = bundle.getString("name","");
    String sex     = 
bundle.getString("sex","");


/************************************************************/

获取被激活的Activity返回的数据


主Activity

    private final int REQUESTCODE_A=1;//  requestCode用来判断是从哪个Activity返回的
    private final int REQUESTCODE_B=2;//

    Intent intent_a = new Intent("","");
    intent_a.putExtra("name","name");
    startActivityForResult(intent_a,REQUESTCODE_A);//第二个参数是requestCode,以此来判断数据是从哪个Activity返回的

    Intent intent_b = new Intent("","");
    intent_b.putExtra("dianhua","123456");
    startActivityForResult(intent_b,REQUESTCODE_B);//第二个参数是requestCode,以此来判断数据是从哪个Activity返回的

注意:如果要获取激活的Activity返回的数据, 在用startActivityForResult(”“,”“)激活活动时,一定不要使用finish()方法销毁原来的活动,即startActivityForResult(”“,”“)方法跟finish()方法不要同时使用。
重写Activity的 onActivityResult方法
   
 @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            // TODO Auto-generated method stub  
            super.onActivityResult(requestCode, resultCode, data);
            if(resultCode==2){  //如果resultCode==2则说明处理成功
                if(requestCode==REQUESTCODE_A){ // 判断数据是从哪个Activity返回的
                   String result = data.getStringRxtra("dedaole","");//接收返回数据  
                    ............................................................................................
                }else if(requestCode==REQUESTCODE_B){
                   ..........................................................................................................
                }
            }
       }

requestCode     用来判断数据是从哪个Activity返回的
resultCode        用来标示被激活的Activity接收到传递过来的数据后,对数据的处理结果,处理的结果不同返回的数据不同。

被激活的Activity

 ......................................................//此处为获取Activity传递过来的数据,并作出相应的处理,根据处理的结果不同,返回不同的“结果码: resultCode”
Intent data = new Intent();
data.putExtra("dedaole", "dedaole");
setResult(2, data);  //返回的2是“结果码: resultCode”,设置不同的结果码来表示数据处理的不同结果,此处返回的结果码为2,来表示数据处理成功。
finish();


























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值