編輯:關於Android編程
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文件中配置
一個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文件中配置
可以看出其實是根據Action和Category兩個屬性共同決定啟動哪個Activity的,Category可以有多個,只要滿足其中的一個即可。
實際上Intent不僅可以啟動我們定義的Activity,也可以啟動系統和其他應用的Activity
ACTION_MAIN 應用程序入口
ACTION_VIEW 顯示指定數據
ACTION_ATTACH_DATA 指定某塊數據將被附加到其他地方
ACTION_EDIT 編輯指定數據
ACTION_PICK 從列表中選擇某項,並返回所選數據
ACTION_CHOOSER 顯示一個Activity選擇器
ACTION_GET_CONTENT 讓用戶選擇數據,並返回所選數據
ACTION_DIAL 顯示撥號面板
ACTION_CALL 直接向指定用戶打電話
ACTION_SEND 向其他人發送數據
ACTION_SENDTO 向其他人發送消息
ACTION_ANSWER 應答電話
ACTION_INSERT 插入數據
ACTION_DELETE 刪除數據
ACTION_RUN 運行數據
ACTION_SYNC 執行數據同步
ACTION_PICK_ACTIVITY 用於選擇Activity
ACTION_SEARCH 執行搜索
ACTION_WEB_SEARCH 執行web搜索
ACTION_FACTORY_TEST 工廠測試的入口點
這裡僅列出部分更多關於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; } } }
前言1、什麼是NDK?NDK全稱是Native Development Kit,NDK提供了一系列的工具,幫助開發者快速開發C(或C++)的動態庫,並能自動將so和jav
1.前言分析完Zygote和SystemServer的啟動過程後,接著我們來分析Android進程的啟動過程。前面一篇文章有提到Zygote是通過復制自身的方式來穿件一個
前言:本來我是做電視應用的,但是因為公司要出手機,人員緊張,所以就抽調我去支援一下,誰叫俺是雷鋒呢!我做的一個功能就是處理手機中的應用ICON,處理無非就是美化一下,重新
Android 如何修改APK的默認名稱用Android Studio 打包App時生成的名稱默認是 app-release.apk(已簽名) 或 app-debug.a