zoukankan      html  css  js  c++  java
  • Intent的属性及Intent-filter配置——Action、Category属性与intent-filter属性

           Intent的Action、Category属性都是一个普通的字符串,其中Action代表该Intent所要完成的一个抽象“动作”,而Category则用于为Action增加额外的附加列别的信息。通常Action属性会与Category属性结合使用。

          Action要完成的只是一个抽象的动作,这个动作具体由哪个组件(或许是Activity,或许是BroadcastReceiver)来完成,Action这个字符串并不管。比如Android提供的标准Action:Intent.ACTION_VIEW,它只表示一个抽象的查看操作,但具体查看什么、启动哪个Activity来查看,Intent.ACTION_VIEW并不知道——这取决于Activity的<intent-filter.../>配置,只要某个Activity的<intent-filter.../>配置中包含了该ACTION_VIEW,该Activity就有可能被启动。

          下面通过一个简单的示例来示范Action属性(就是普通字符串)的作用。下面的程序的第一个Activity非常简单,它只包括一个普通按钮,当用户单击该按钮时,程序会跳转到第二个Activity——但第一个Activity指定跳转的Intent时,并不以“硬编码”的方式指定要跳转的Activity,而是为Intent指定Action属性。

         界面布局文件如下:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
        <Button android:id="@+id/bn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="启动第二个Activity"/>
    </LinearLayout>

    后台代码文件如下:

    package com.example.studyintent;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.content.Intent;
    import android.view.Menu;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    
    public class ActionAttr extends Activity {
        //定义一个Action常量
         public final static String CRAZYIT_ACTION="com.example.studyintent.action.CRAZYIT_ACTION";
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_action_attr);
            Button bn=(Button)findViewById(R.id.bn);
            //为bn按钮绑定事件监听器
            bn.setOnClickListener(new OnClickListener(){
    
                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    //创建Intent对象
                    Intent intent=new Intent();
                    //为Intent设置Action属性(属性值就是一个普通字符串)
                    intent.setAction(ActionAttr.CRAZYIT_ACTION);
                    startActivity(intent);
                }});
            
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.action_attr, menu);
            return true;
        }
    
    }

        由于上面的程序指定启动Action属性ActionAttr.CRAZYIT_ACTION常量(常量值为com.example.studyintent.action.CRAZYIT_ACTION)的Activity,也就要求被启动Activity对应的配置元素的<intent-filter.../>元素里至少包括一个如下的<action.../>子元素:

    <action android:name="com.example.studyintent.action.CRAZYIT_ACTION"/>

        需要指出的是,一个Intent对象最多只能包含一个Action属性,程序可调用Intent的setAction(String str)方法来设置Action属性值;但一个Intent对象可以包含多个Category属性,程序可调用Intent的addCategory(Stirng str)方法来为Intent添加Category属性。当程序创建Intent时,该Intent默认启动Category属性值为Intent.CATEGORY_DEFAULT常量(常量值为android.intent.category.DEFAULT)的组件。

        因此,虽然上面程序的粗体字代码并未指定目标Intent的Category属性,但该Intent已有一个值为android.intent.category.DEFAULT的Category属性值,因此被启动Activity对应的配置元素的<intent-filter.../>元素里至少还包含一个如下的<category.../>子元素:

          <category android:name="android.intent.category.DEFAULT" />

      下面是被启动Activity的完整配置。

      <activity
                android:name="com.example.studyintent.SecondActivity"
                android:label="@string/title_activity_second" >
                <intent-filter>
    
                    <!-- 指定该Activity能响应Action为指定字符串的Intent -->
                    <action android:name="com.example.studyintent.action.CRAZYIT_ACTION" />
                    <!-- 指定该Activity能响应category为指定字符串的Intent -->
                    <category android:name="com.example.studyintent.category.CRAZYIT_CATEGORY" />
                    <!-- 指定该Activity能响应category为android.intent.category.DEFAULT的Intent -->
                    <category android:name="android.intent.category.DEFAULT" />
                </intent-filter>
            </activity>

       上面的配置代码中配置了一个实现类为SecondActivity的Activity,因此程序还提供了这个Activity的代码,代码如下:

    package com.example.studyintent;
    
    import java.util.Set;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.content.ComponentName;
    import android.view.Menu;
    import android.widget.EditText;
    
    public class SecondActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_second);
          
            EditText show=(EditText)findViewById(R.id.show);
            //获取该Activity对应的Intent的Action属性
            String action=getIntent().getAction();
            //显示Action属性
            show.setText("Action为:"+action);
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.second, menu);
            return true;
        }
    
    }

         上面的程序代码很简单,它只是在启动时把启动该Activity的Intent的Action属性显示在指定文本框内。运行上面的程序并单击程序中的按钮,将看到如图5.2所示界面。

     接下来的示例程序将会示范Category属性的用法,该程序的第一个Activity的代码如下。

    package com.example.studyintent;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.content.Intent;
    import android.view.Menu;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    
    public class ActionCateAttr extends Activity {
        //定义一个Action常量
        final static String CRAZYIT_ACTION="com.example.studyintent.action.CRAZYIT_ACTION";
        //定义一个Category常量
        final static String CRAZYIT_CATEGORY="com.example.studyintent.category.CRAZYIT_CATEGORY";
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_action_cate_attr);
            Button bn=(Button)findViewById(R.id.bn);
            bn.setOnClickListener(new OnClickListener(){
    
                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    Intent intent=new Intent();
                    //设置Action属性
                    intent.setAction(ActionCateAttr.CRAZYIT_ACTION);
                    //添加Category属性
                    intent.addCategory(ActionCateAttr.CRAZYIT_CATEGORY);
                    startActivity(intent);
                }});
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.action_cate_attr, menu);
            return true;
        }
    
    }

    下面是程序要启动的目标Action所对应的配置代码:

     <activity
                android:name="com.example.studyintent.SecondActivity"
                android:label="@string/title_activity_second" >
                <intent-filter>
    
                    <!-- 指定该Activity能响应Action为指定字符串的Intent -->
                    <action android:name="com.example.studyintent.action.CRAZYIT_ACTION" />
                    <!-- 指定该Activity能响应category为指定字符串的Intent -->
                    <category android:name="com.example.studyintent.category.CRAZYIT_CATEGORY" />
                    <!-- 指定该Activity能响应category为android.intent.category.DEFAULT的Intent -->
                    <category android:name="android.intent.category.DEFAULT" />
                </intent-filter>
            </activity>

    上面配置Activity时也指定该Activity的实现类为SecondActivity,该实现类的代码如下:

    package com.example.studyintent;
    
    import java.util.Set;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.content.ComponentName;
    import android.view.Menu;
    import android.widget.EditText;
    
    public class SecondActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_second);
           
            
            EditText show=(EditText)findViewById(R.id.show);
            //获取该Activity对应的Intent的Action属性
            String action=getIntent().getAction();
            //显示Action属性
            show.setText("Action为:"+action);
            EditText cate=(EditText)findViewById(R.id.cate);
            //获取该Activity对应的Intent的Category
            Set<String> cates=getIntent().getCategories();
             //显示Category属性
            cate.setText("Category属性为:"+cates);
        
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.second, menu);
            return true;
        }
    
    }

    运行上面程序单击程序中的按钮,将看到如图5.3所示的界面

  • 相关阅读:
    Leetcode 50.Pow(x,n) By Python
    Leetcode 347.前K个高频元素 By Python
    Leetcode 414.Fizz Buzz By Python
    Leetcode 237.删除链表中的节点 By Python
    Leetcode 20.有效的括号 By Python
    Leetcode 70.爬楼梯 By Python
    Leetcode 190.颠倒二进制位 By Python
    团体程序设计天梯赛 L1-034. 点赞
    Wannafly挑战赛9 C-列一列
    TZOJ Start
  • 原文地址:https://www.cnblogs.com/wolipengbo/p/3426868.html
Copyright © 2011-2022 走看看