1. 程式人生 > >閱讀《Android 從入門到精通》(33)——Intent 分類

閱讀《Android 從入門到精通》(33)——Intent 分類

data- provide 推斷 gadget nload bat exceptio extra 有時

Intent 分類

顯式 Intent:Intent("android.intent.action.CALL", Uri.parse("tel:" + string));
須要指明名字啟動。用於程序內多 Activity 交互,通經常使用於應用程序內部消息,有名 Action Intent。


隱式 Intent:一般不指明名字,而是採用廣播的形式,一般是 Broadcast Intent。

Action Intent:

技術分享

動作非常大程度上決定了剩下的 Intent 怎樣構建,特別是數據(data)和附加(extras)字段,就像一個方法名決定了參數和返回值。

因此,Intent 對象動作通過 setAction 設置後。詳細的 Action 具有詳細的數據格式要求。比方:ACTION_EDIT 的數據字段將包括用於編輯文檔的 URL;ACTION_CALL 則是 tel:URL。此外,還應了解數據格式類型。比方獲取的數據是音頻、視頻、文字、圖像還是其它,這就須要通過 setType 指定 MIME。經常使用的 Category 例如以下:

CATEGORY_BROWSABLE
CATEGORY_GADGET
CATEGORY_HOME
CATEGORY_LAUNCHER
CATEGORY_PREFERENCE

addCategory 用於加入一個種類到 Intent。與此相應的是 removeCategory 用於刪除前一個種類。一個Intent 能夠有多個 Category,getCategories 用於獲取 Intent 中的全部種類

Broadcast Intent

Action Intent 僅僅能被一個指定的 Activity 響應,假設須要推送通知這種廣播信息。則須要 Broadcast Intent

Broadcast Intent 處理流程

技術分享

註冊 Broadcast Intent 步驟

繼承 BroadcastReceiver,並重寫 onReceiver 方法:

package com.sweetlover.camera2basic;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class MyReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context arg0, Intent arg1) {
		// TODO Auto-generated method stub
		
	}

}

依據 IntentFilter 註冊 Broadcast Intent

Java 註冊

IntentFilter myFilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVER");
MyReceiver myReceiver = new MyReceiver();
Context.registerReceiver(myReceiver, myFilter);

XML 註冊

<receiver android:name=".MyReceiver">
	<intent-filter>
		<action android:name="<receiver android:name=".MyReceiver">
	</intent-filter>
</receiver>

廣播

技術分享

接收

Broadcast Receiver 接收到 Intent 後對其推斷,符合條件則響應 onReceiver 方法

public void onReceiver(Context myContext, Intent myIntent) {
	if (myIntent.getAction().equals(Intent.ACTION_BATTERY_LOW)) {
		// TODO 電量低時切換到節電模式,關閉 WIFI 和 GPS
	}
}

銷毀

每當 Receiver 響應一個 Intent 後就被自己主動銷毀,Receiver 有時間限制,超時則覺得程序無響應

詳細演示樣例

完整程序:http://download.csdn.net/detail/sweetloveft/9468520

1.MainActivity.java

@Override
protected void onStart() {
	// TODO Auto-generated method stub
	super.onStart();
		
	try {
		Thread.sleep(5000);
	} catch (InterruptedException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	final Intent intent = new Intent(MY_NEW_LIFEFORM);
	sendBroadcast(intent);
}

2.Receiver.java

package com.sweetlover.activity;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class Receiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		// TODO Auto-generated method stub
		Toast.makeText(context, "收到廣播信息", Toast.LENGTH_SHORT).show();
	}
}

3.activity_main.xml

加入一個空的 LinearLayout 布局就可以

4.AndroidManifest.xml

在 <application> 標簽裏面加入

        <receiver android:name="com.sweetlover.activity.Receiver">
            <intent-filter>
                <action android:name="com.china.ui.NEW_LIFEFORM" />
            </intent-filter>
        </receiver>

閱讀《Android 從入門到精通》(33)——Intent 分類