• 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所示的界面

  • 相关阅读:
    Finite Difference Method with Mathematica
    评论
    The Woman in Red Is Seen as a Threat by Other Wom
    Why Does Everyone Else Appear to Be Succeeding?
    The Sorrows of Young Werther
    【洛谷P5607】无力回天 NOI2017
    【YbtOJ#532】往事之树
    【YbtOJ#582】大收藏家
    【牛客Wannafly挑战赛23 F】计数
    【YbtOJ#573】后缀表达
  • 原文地址:https://www.cnblogs.com/wolipengbo/p/3426868.html
Copyright © 2020-2023  润新知