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
}
};
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。
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。
沒有留言:
張貼留言