由於每個應用程式都運行在自己的進程空間,並且可以從應用程式UI運行另一個服務進程,而且經常會在不同的進程間傳遞對象。在Android平台,一個進程通常不能訪問另一個進程的記憶體空間,所以要想對話,需要將對象分解成作業系統可以理解的基本單元,並且有序的通過進程邊界。 通過代碼來實現這個資料轉送過程是冗長乏味的,Android提供了AIDL工具來處理這項工作。
這裡通過與鬧鐘執行個體來實現這一機制的簡單實現:
鬧鐘設定的實現是通過AlarmManager來實現的,AlarmManager提供系統警示器服務,AlarmManager就會通過onReceive方法來執行這個事件,而將事件傳給onReceive就是通過註冊 ,然後利用android:process=":remote這一機制來實現的。
[java]
</activity>
<receiver android:name=".AlarnReceiver" android:process=":remote"/>
</application>
而android:process=":remote意思就是說你配的這個組件會在另外一個進程中運行,這裡面另一個就是pendingIntent,pendingIntent是一種特殊的Intent。主要的區別在於Intent的執行立刻的,而pendingIntent的執行不是立刻的。pendingIntent執行的操作實質上是參數傳進來的Intent的操作,但是使用pendingIntent的目的在於它所包含的Intent的操作的執行是需要滿足某些條件的。
下面是鬧鐘簡單源碼:
[java]
public class MainActivity extends Activity
{
Button mButton1;
Button mButton2;
TextView mTextView;
Calendar calendar;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/* 執行個體模式 */
calendar=Calendar.getInstance();
mTextView=(TextView)findViewById(R.id.text);
mButton1=(Button)findViewById(R.id.set);
mButton2=(Button)findViewById(R.id.cancle);
mButton1.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
//擷取目前時間
calendar.setTimeInMillis(System.currentTimeMillis());
int mHour=calendar.get(Calendar.HOUR_OF_DAY);
int mMinute=calendar.get(Calendar.MINUTE);
new TimePickerDialog(MainActivity.this,
new TimePickerDialog.OnTimeSetListener()
{
public void onTimeSet(TimePicker view,int hourOfDay,int minute)
{
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY,hourOfDay);
calendar.set(Calendar.MINUTE,minute);
calendar.set(Calendar.SECOND,0);
calendar.set(Calendar.MILLISECOND,0);
/* 建立Intent和PendingIntent,來調用目標組件 */
Intent intent = new Intent(MainActivity.this, AlarnReceiver.class);
/*從系統取得一個用於向BroadcastReceiver的Intent廣播的PendingIntent對象*/
PendingIntent pendingIntent=PendingIntent.getBroadcast(MainActivity.this,0, intent, 0);
AlarmManager am;
/* 擷取鬧鐘管理的執行個體 */
am = (AlarmManager)getSystemService(ALARM_SERVICE);
/* 設定鬧鐘 */
am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
/* 設定周期鬧 */
am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (10*1000), (24*60*60*1000), pendingIntent);
String tmpS="設定鬧鐘時間為"+format(hourOfDay)+":"+format(minute);
mTextView.setText(tmpS);
}
},mHour,mMinute,true).show();
}
});
mButton2.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
Intent intent = new Intent(MainActivity.this, AlarnReceiver.class);
PendingIntent pendingIntent=PendingIntent.getBroadcast(MainActivity.this,0, intent, 0);
AlarmManager am;
/* 擷取鬧鐘管理的執行個體 */
am =(AlarmManager)getSystemService(ALARM_SERVICE);
/* 取消 */
am.cancel(pendingIntent);
mTextView.setText("鬧鐘已取消!");
}
});
}
/* 格式化字串(7:3->07:03) */
private String format(int x)
{
String s = "" + x;
if (s.length() == 1)
s = "0" + s;
return s;
}
}
這裡簡單實現功能就是到達我們設定的特定時間,就會通知onReceive方法來提示鬧鐘提示!而這前提就是開闢的另一個線程!
下面是另一個類的實現:
[java]
public class AlarnReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context arg0, Intent arg1)
{
// TODO Auto-generated method stub
Toast.makeText(arg0, "你設定的鬧鐘時間到了", Toast.LENGTH_LONG).show();
}
}