2011年12月26日 星期一

Android - PendingIntent(1) - 基本用法

PendingIntent和Intent到底有什麼不同,請看原文
http://developer.android.com/reference/android/app/PendingIntent.html

簡 單來說,Intent指定好要幹嘛後,就去做了。而PedingIntent則是先把某個Intent包好,丟給某個程式,以後再去執行Intent要幹 嘛。比如用startActivity(intent)就會直接去啟動和intent關聯的某個程式了。相對的,假設APK1想告訴APK2在某個情況 下,去執行APK3的話,就可以在APK1設定好PendingIntent(內容就是去執行APK3),然後丟過去給APK2,然後APK2在某種情況 下,就去執行PendingIntent,那就會等於執行APK3。這裡不單單是指startActivity,也可以是對Broadcast和 Service進行處理。

那為何不直接在APK2就用startActivity(Intent)寫好要執行 APK3,不就不用丟PendingIntent了?因為APK2要「動態」決定啟,不同情況下要執行那一支APK,所以不能先寫死。假設使用 startActivity的情況下,如果有A1、B1、C1三支程式都要APK2去執行不同程式,分別為A3,B3和C3,那不就變成APK2的程式要 寫上startActivity(A3)、startActivity(B3)、startActivity(C3)。假設未來還會有新的D3、E3…會 被執行的話,APK2的程式碼,不就無法要不停的調整了。所以利用PendingIntent就可以解決這個問題。

舉 個例子: 假設Pending.java會要notification bar秀出訊息,而使用者在notification bar按下後就執行Called.java ,就可以在Pending.java包好一個PendingIntent丟給notification bar,當使用者按下notification list時,就執行APK2。程式如下

public class Pending extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        OnClickListener mListener = new OnClickListener() {
            public void onClick(View v) {
                // TODO Auto-generated method stub
                NotificationManager mManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

                Notification mNotification = new Notification(R.drawable.icon,
                        "This is a notification bar message",
                        System.currentTimeMillis());

                PendingIntent mIntent = PendingIntent.getActivity(Pending.this,
                        0, new Intent(Pending.this, Called.class),
                        PendingIntent.FLAG_UPDATE_CURRENT);

                mNotification.setLatestEventInfo(Pending.this, "Notice!",
                        "It will intent to Called.class", mIntent);
                mManager.notify(0, mNotification);

            }
        };

        Button mButton = (Button) findViewById(R.id.Button01);
        mButton.setOnClickListener(mListener);
    }
}


public class Called extends Activity {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.called);
    }
}

AndroidManifest.xml如下
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.pending" android:versionCode="1" android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".Pending" 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=".Called" android:label="@string/app_name">
        </activity>

    </application>
</manifest>

執行結果如下:









































































因 為notification會接收PendingIntent,因此只要在Pending.java傳出想要被notification bar執行的程式,都不需要調整notification的程式。假設你在Pending.java 想把Intent丟給notification,叫它以後再執行,那是沒有辦法的,只能用PendingIntent。

沒有留言:

張貼留言