Intent的定義:
Android中提供了Intent機制來協助應用間的交互與通訊,或者采用更準確的說法是,Intent不僅可用于應用程序之間,也可用于應用程序內部的activity, service和broadcast receiver之間的交互。Intent這個英語單詞的本意是“目的、意向、意圖”。
使用Intent啟動系統組件:
三種應用程序基本組件——activity, service和broadcast receiver——是使用稱為intent的消息來激活的。Intent消息傳遞是一種組件間運行時綁定的機制. intent是Intent對象, 它包含了需要做的操作的描述, 或者, 對于廣播來說, 包含了正在通知的消息內容. 對于向這三種組件發送intent有不同的機制:
使用Context.startActivity() 或 Activity.startActivityForResult(), 傳入一個intent來啟動一個activity. 使用 Activity.setResult(), 傳入一個intent來從activity中返回結果.
將intent對象傳給Context.startService()來啟動一個service或者傳消息給一個運行的service. 將intent對象傳給 Context.bindService()來綁定一個service.
將intent對象傳給 Context.sendBroadcast(), Context.sendOrderedBroadcast(),或者Context.sendStickyBroadcast()等廣播方法,則它們被 傳給 broadcast receiver.
在上述三種情況下, android系統會自己找到合適的activity, service, 或者 broadcast receivers來響應intent. 三者的intent相互獨立互不干擾.
Intent的屬性:
component(組件):目的組件
action(動作):用來表現意圖的行動
category(類別):用來表現動作的類別
data(數據):表示與動作要操縱的數據
type(數據類型):對于data范例的描寫
extras(擴展信息):擴展信息
Flags(標志位):期望這個意圖的運行模式
**1,component(組件):目的組件**
Component屬性明確指定Intent的目標組件的類名稱。(屬于直接Intent)
ComponentName對象包含的構造器:
ComponentName(String pkg,String cls)創建在pkg所在報下的cls類所對應的組件
ComponentName(Context pkg,String cls)創建在pkg所在報下的cls類所對應的組件
ComponentName(Context?pkg,Class cls)創建在pkg所在報下的cls類所對應的組件
一個ComponentName需要指定包名和類名--這就可以唯一確定一個組件類
另外Intent可以根據給定的組件類去啟動特定的組件,Intent有下面的方法:
setClass(Context packageContext,Class cls):設置該Intent將要啟動的組件對應的類
setClassName(Context packageContext,String className):設置該Intent將要啟動的組件對應的類
setClassName(String packageContext,String className):設置該Intent將要啟動的組件對應的類
**以上方法中的兩個參數其實就確定了一個Component組件**
Intent類型分為顯式Intent(直接類型)、隱式Intent(間接類型)。官方建議使用隱式Intent。上述屬性中,component屬性為直接類型,其他均為間接類型。
啟動第二個Activity時:
~~~
// 為bn按鈕綁定事件監聽器
bn.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View arg0)
{
// 創建一個ComponentName對象
ComponentName comp = new ComponentName(ComponentAttr.this,
SecondActivity.class);
Intent intent = new Intent();
// 為Intent設置Component屬性
intent.setComponent(comp);
// Intent intent = new Intent(ComponentAttr.this,
// SecondActivity.class);
startActivity(intent);
}
});
~~~
可以這樣寫:
~~~
Intent intent = new Intent();
//setClass函數的第一個參數是一個Context對象
//Context是一個類,Activity是Context類的子類,也就是說,所有的Activity對象,都可以向上轉型為Context對象
//setClass函數的第二個參數是一個Class對象,在當前場景下,應該傳入需要被啟動的Activity類的class對象
intent.setClass(MainActivity.this, SecondActivity.class);
startActivity(intent);
~~~
還可以這樣寫:
~~~
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent);
~~~
**2、Action(動作):用來表現意圖的行動**
Action 是一個用戶定義的普通字符串,代表該Intent索要完成的一個抽象“動作”。用于描述一個 Android 應用程序組件,一個 Intent Filter 可以包含多個 Action。在 AndroidManifest.xml 的Activity 定義時,可以在其 節點指定一個 Action列表用于標識 Activity 所能接受的“動作”
? ? Action要完成的知識一個抽象的動作,這個動作具體由哪個組件(Activity,Service,BroadcastReceiver)來完成,Action這個字符不管。比如Android提供的標準Action:Intent.ACTION_VIEW,它值表示一個抽象的查看動作,但具體什么,啟動哪個Activity來看,Intent.ACTION_VIEW并不知道---這取決于Activity的配置,只要某個Activity的配置中包含了該ACTION_VIEW,該Activity就有可能被啟動。
一句話總就是說,哪個Activity的intent-filter...>配置中有Intent設置的Action屬性,就可能被啟動。
MainActivity .java
~~~
public class MainActivity extends Activity {
public final static String ACTION="com.hust.actiontest";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn=(Button) findViewById(R.id.button1);
btn.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent=new Intent();
intent.setAction(MainActivity.ACTION);
startActivity(intent);
}
});
}
~~~
~~~
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.hust.actionattrtest"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="20"
android:targetSdkVersion="22" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".SeclondActivity"
android:label="@string/title_activity_seclond" >
<intent-filter>
<!-- 指定該Activity能響應Action為指定字符串的Intent -->
<action android:name="com.hust.actiontest" />
<!-- 指定該Action能響應Category屬性為指定字符串的Intent -->
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application>
</manifest>
~~~
SecondActivity.java
~~~
public class SeclondActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_seclond);
TextView show = (TextView) findViewById(R.id.show);
// 獲取該Activity對應的Intent的Action屬性
String action = getIntent().getAction();
// 顯示Action屬性
show.setText("Action為:" + action);
}
~~~
因為SeclondActivity的的action有com.hust.actiontest所以就可能被MainActivity啟動
使用Intent的Action屬性啟動組件的過程大概是:主Activity的Intent的Action屬性設置為一個字符串str比如“com.hust.edu”,然后再去Manifest.xml中查找各個Activity組件的的action是否有這個字符串str=com.hust.edu,如果有,這個Activity可能被啟動。
- 前言
- Eclipse搭建android環境及Genymotion模擬器安裝問題解決方法
- 表格布局(TableLayout)及重要屬性
- 幀布局(FrameLayout)及屬性
- layout_width和width,layout_height和height
- UI組件之TextView及其子類
- UI組件之TextView及其子類(一)TextView和EditText
- UI組件之TextView及其子類(二)RadioButton和CheckBox
- UI組件之TextView及其子類(三)ToggleButton和Switch
- UI組件之TextView及其子類(四)AnalogClock,DigitalClock
- UI組件之TextView及其子類(五)計時器Chronometer
- UI組件之ImageView及其子類(一)ImageView顯示圖片
- UI組件之ImageView及其子類(二)ImageButton ,ZoomButton
- UI組件之AdapterView及其子類關系,Adapter接口及其實現類關系
- UI組件之AdapterView及其子類(一)三種Adapter適配器填充ListView
- UI組件之AdapterView及其子類(二)GridView網格視圖的使用
- UI組件之AdapterView及其子類(三)Spinner控件詳解
- UI組件之AdapterView及其子類(四)Gallery畫廊控件使用
- UI組件之AdapterView及其子類(五)ListView組件和ListActivity
- UI組件之AdapterView及其子類(六)ExpandableListView組件和ExpandableListActivity的使用
- UI組件之 ProgressBar及其子類(一)ProgressBar進度條的使用
- UI組件之ProgressBar及其子類(二)SeekBar拖動條和RatingBar星級評分條的使用
- ViewFlipper的功能和用法
- Toast的功能和用法
- TabHost選項卡的 功能和用法
- AlertDialog創建6種對話框的用法
- Android基于監聽的事件處理機制
- Android基于回調的事件處理
- Handler消息傳遞機制(一)
- Handler消息傳遞機制(二)Handler,Loop,Message,MessageQueue的工作原理
- 啟動Activity的兩種方式startActivity和startActivityForResult(一)
- 啟動Activity的兩種方式startActivity和startActivityForResult(二)
- Activity的生命周期理解
- Bundle在Activity之間交換數據
- 通過 Intent 傳遞類對象
- Intent對象詳解(一)
- Intent對象詳解(二)
- 使用指定的Action,Category調用系統Activity
- 使用Action,Data屬性啟動系統Activity
- Android數據存儲的三種方式-SharedPrefrences,File,SQLite