您的位置:首页 > 移动开发

安卓ApiDemos学习 app/Alarm/AlarmService

2011-11-04 10:15 405 查看
使用alarm机制定时启动service,并让service显示Notification的例子

首先创建待定意图

mAlarmSender = PendingIntent.getService(AlarmService.this,0, new Intent(AlarmService.this, AlarmService_Service.class), 0);
注册alarm,30秒启动一次

AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,firstTime, 30*1000, mAlarmSender);


AlarmService_Service是接收intent的service

service首先显示Notification

mNM = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
showNotification();

private void showNotification() {
CharSequence text = getText(R.string.alarm_service_started);
Notification notification = new Notification(R.drawable.stat_sample, text,
System.currentTimeMillis());
PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
new Intent(this, AlarmService.class), 0);
notification.setLatestEventInfo(this, getText(R.string.alarm_service_label),
text, contentIntent);
mNM.notify(R.string.alarm_service_started, notification);
}




Notification的第1个参数,用来表示通知发出时,状态栏显示的的图标

Notification的第2个参数,用来表示通知发出时,状态栏显示的滚动文字

Notification的第3个参数,用来表示通知的时间

notification.setLatestEventInfo的参数2,里面设置的文字对应Sample Alarm Service这句话

notification.setLatestEventInfo的参数3,里面设置的文字对应The alarm service has started running这句话

mNM.notify(R.string.alarm_service_started, notification);
notify的第一个参数表示Notification的唯一ID,cancel通知的时候要用到这个ID

service退出的时候,就会将通知消除

public void onDestroy() {
// Cancel the notification -- we use the same ID that we had used to start it
mNM.cancel(R.string.alarm_service_started);

// Tell the user we stopped.
Toast.makeText(this, R.string.alarm_service_finished, Toast.LENGTH_SHORT).show();
}


点击通知的时候,会执行传入的待定意图,启动画面

PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
new Intent(this, AlarmService.class), 0);
notification.setLatestEventInfo(this, getText(R.string.alarm_service_label),
text, contentIntent);


注意:PendingIntent.getService是用来启动service的待定意图,PendingIntent.getActivity是用来启动Activity的待定意图

service接着启动一个线程,用来暂停15秒

Thread thr = new Thread(null, mTask, "AlarmService_Service");
thr.start();
在线程中,等待15秒后,会停止service

long endTime = System.currentTimeMillis() + 15*1000;
while (System.currentTimeMillis() < endTime) {
synchronized (mBinder) {
try {
mBinder.wait(endTime - System.currentTimeMillis());
} catch (Exception e) {
}
}
}

// Done with our work...  stop the service!
AlarmService_Service.this.stopSelf();

最后分析下Binder运用。按照我的理解,Binder就像是service提供的一个远程调用的插座。

其他进程可以通过这个插座连接到service上,并调用Binder提供的一些方法。ServiceConnection就像是其他进程的插头,用来取得service提供的Binder。

private ServiceConnection mConnection = new ServiceConnection(){
public void onServiceConnected(ComponentName className, IBinder service) {
// Called when the connection is made.
serviceBinder = ((MyService.MyBinder)service).getService();
}

public void onServiceDisconnected(ComponentName className) {
// Received when the service unexpectedly disconnects.
serviceBinder = null;
}
};
绑定service,需要指定目的service以及ServiceConnection

Intent bindIntent = new Intent(MyActivity.this, MyService.class);
bindService(bindIntent, mConnection, Context.BIND_AUTO_CREATE);
当然,本例并没有其他进程连接过来,只是利用binder对象作为同步lock的对象而已

因为没有人调用binder的notify,所以它只能老老实实的等待wait函数超时了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: