• Android菜鸟的成长笔记(8)——Intent与Intent Filter(上)


    Intent代表了Android应用的启动“意图”,Android应用将会根据Intent来启动指定组件,至于到底启动哪个组件,取决于Intent的各个属性。

    一、显式的Intent

    明确指定了要启动的组件的Intent我们称为显式的Intent

    例如:

    package com.example.testintent;
    
    import android.app.Activity;
    import android.content.ComponentName;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    
    public class MainActivity extends Activity {
    	Button button;
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		button = (Button)findViewById(R.id.button1);
    		button.setOnClickListener(new OnClickListener() {
    			
    			@Override
    			public void onClick(View arg0) {
    				ComponentName comp = new ComponentName(MainActivity.this, SecondActivity.class);
    				Intent intent = new Intent();
    				intent.setComponent(comp);
    				startActivity(intent);
    			}
    		});
    	}
    }
    
    注意在manifest文件里注册SecondActivity

    Intent的Componet属性需要接收一个ComponentName对象,ComponetName对象其实是一个指定包和要启动的Activity路径的类,有如下几个构造

    componentName(String pkg, String cls)

    componentName(Context pkg, String cls)

    componentName(Context pkg, Class<?> cls)

    componentName(Parcel in)

    除了这个属性之外Intent还包含了如下三个方法:

    setClass(Context packageContext, Class<?> cls )

    setClassName(Context packageContext, String className)

    setClassName(String packageName, String className )

    上面的代码可以简化为如下代码:

    Intent intent = new Intent(MainActivity.this, SecondActivity.class);
    startActivity(intent);

    二、隐式的Intent

    没有明确指定要启动的组件的Intent我们称为隐式的Intent

    Intent除了上面的Componet属性外还有Action、Category属性

    Action代表Intent所要完成的一个抽象动作,而Category则是动作附加的类别信息。

    例如:

    package com.example.testintent;
    
    import android.app.Activity;
    import android.content.ComponentName;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    
    public class MainActivity extends Activity {
    	Button button;
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		button = (Button)findViewById(R.id.button1);
    		button.setOnClickListener(new OnClickListener() {
    			
    			@Override
    			public void onClick(View arg0) {
    				Intent intent = new Intent();
    				intent.setAction("com.example.intent.action.TEST_ACTION");
    				startActivity(intent);
    			}
    		});
    	}
    }
    
    manifest文件中配置

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

    一个Intent只能指定一个Action属性,可以包含多个Category属性,当程序创建时,默认启动category为DEFAULT的组件。

    接下来我们来看看Category属性的用法

    public void onClick(View arg0) {
    	Intent intent = new Intent();
    	intent.setAction("com.example.intent.action.TEST_ACTION");
    	intent.addCategory("android.intent.category.TEST_CATEGERY");
    	startActivity(intent);
    }

    manifest文件中配置

            <activity 
                android:name=".SecondActivity">
                <intent-filter >
                    <action android:name="com.example.intent.action.TEST_ACTION"/>
                    <category android:name="android.intent.category.DEFAULT"/>
                    <category android:name="android.intent.category.TEST_CATEGERY"/>
                </intent-filter>
            </activity>
    可以看出其实是根据Action和Category两个属性共同决定启动哪个Activity的,Category可以有多个,只要满足其中的一个即可。

    实际上Intent不仅可以启动我们定义的Activity,也可以启动系统和其他应用的Activity

    这里仅列出部分更多关于Action和Category属性请参阅:http://developer.android.com/reference/android/content/Intent.html

    三、一个获取通讯录的实例:

    package com.example.testintent;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.database.Cursor;
    import android.net.Uri;
    import android.os.Bundle;
    import android.provider.ContactsContract;
    import android.provider.ContactsContract.Contacts;
    import android.support.v4.content.CursorLoader;
    import android.util.Log;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    
    public class MainActivity extends Activity {
    	private static final String TAG = "MainActivity";
    	Button button;
    	final int PICK_CONTACT = 0;
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		button = (Button)findViewById(R.id.button1);
    		button.setOnClickListener(new OnClickListener() {
    			
    			@Override
    			public void onClick(View arg0) {
    				Intent intent = new Intent();
    				intent.setAction(Intent.ACTION_GET_CONTENT);
    				intent.setType("vnd.android.cursor.item/phone");
    				startActivityForResult(intent, PICK_CONTACT);
    			}
    		});
    	}
    	
    	@Override
    	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    		super.onActivityResult(requestCode, resultCode, data);
    		switch (requestCode) {
    			case PICK_CONTACT:
    				if(resultCode == Activity.RESULT_OK){
    					//获取返回数据
    					Uri contactData = data.getData();
    					CursorLoader cursorLoader = new CursorLoader(this, contactData, null, null, null, null);
    					Cursor cursor = cursorLoader.loadInBackground();
    					if(cursor.moveToFirst()){
    						String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
    						String name = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME));
    						Log.i(TAG, "姓名:" + name);
    						//根据联系人查看详细信息
    						Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, 
    									ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, null, null);
    						if(phones.moveToFirst()){ 
    							System.out.println("进来了");
    							String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
    							Log.i(TAG, "电话:" + phoneNumber);
    						}
    						//关闭游标
    						phones.close();
    					}
    					//关闭游标
    					cursor.close();
    				}
    				break;
    
    		default:
    			break;
    		}
    	}
    }
    


  • 相关阅读:
    区块链基础
    区块链基础
    区块链基础
    区块链基础
    浅淡网易云音乐小号/网易云音乐手机号帐号批量注册/出售网易云音乐小号、网易云音乐手机号帐号
    网易云音乐小号批发/网易云音乐账号售卖/网易云音乐账号怎么购买/网易云音乐真人手机账号
    msyql分区命令,删除命令
    elastic job 发布版本后突然不执行问题解决
    Maven安装以及常用命令
    Linux zip 命令
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6469215.html
Copyright © 2020-2023  润新知