AlarmService---让进城在后台一直运行(1)

标签:
it |
分类: Android笔记(难点) |
连接:http://blog.csdn.net/wanglang3081/article/details/7898578
使用alarm机制定时启动service,并让service显示Notification的例子
首先创建待定意图
-
mAlarmSender
= this,0,PendingIntent.getService(AlarmService. new Intent(AlarmService. this,AlarmService_Service. class),0);
-
mAlarmSender
= this,0,PendingIntent.getService(AlarmService. new Intent(AlarmService. this,AlarmService_Service. class),0);
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);
-
AlarmManager
am = (AlarmManager)getSystemService(ALARM_SERVICE); -
am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,firstTime,
30*1000, mAlarmSender);
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); -
}
-
mNM
= (NotificationManager)getSystemService(NOTIFICATION_SERVICE); -
showNotification();
-
- private
void showNotification() { -
CharSequence text = getText(R.string.alarm_service_started); -
Notification notification = Notification(R.drawable.stat_sample, text, -
System.currentTimeMillis()); -
PendingIntent contentIntent = PendingIntent.getActivity( 0, -
Intent( this,AlarmService. class),0); -
notification.setLatestEventInfo( getText(R.string.alarm_service_label), -
text, contentIntent); -
mNM.notify(R.string.alarm_service_started, 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); }
http://hi.csdn.net/attachment/201111/4/0_132036851588EZ.gif
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);
-
mNM.notify(R.string.alarm_service_started,
notification);
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(); -
}
- 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( R.string.alarm_service_finished, Toast.LENGTH_SHORT).show(); -
}
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( 0, -
new Intent( this,AlarmService. class),0); -
notification.setLatestEventInfo(this, getText(R.string.alarm_service_label), -
text, contentIntent);
-
PendingIntent contentIntent = PendingIntent.getActivity( 0, -
Intent( this,AlarmService. class),0); -
notification.setLatestEventInfo( getText(R.string.alarm_service_label), -
text, contentIntent);
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();
-
Thread
thr new= Thread( null,mTask, "AlarmService_Service"); -
thr.start();
Thread thr = new Thread(null, mTask, "AlarmService_Service"); thr.start();在线程中,等待15秒后,会停止service
- long
endTime 15*1000;= System.currentTimeMillis() + - 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();
- long
endTime 15*1000;= System.currentTimeMillis() + - while
(System.currentTimeMillis() < endTime) { -
(mBinder) { -
{ -
mBinder.wait(endTime - System.currentTimeMillis()); -
} (Exception e) { -
} -
} -
}
-
- //
Done with our work... stop the service! - AlarmService_Service.this.stopSelf();
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 newmConnection = 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; -
} -
};
- private
ServiceConnection newmConnection = ServiceConnection(){ -
void onServiceConnected(ComponentName className, IBinder service) { -
Called when the connection is made. -
serviceBinder = ((MyService.MyBinder)service).getService(); -
} -
-
void onServiceDisconnected(ComponentName className) { -
Received when the service unexpectedly disconnects. -
serviceBinder = -
} -
};
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);
-
Intent
bindIntent new= Intent(MyActivity. this,MyService. class); -
bindService(bindIntent,
mConnection, Context.BIND_AUTO_CREATE);
Intent bindIntent = new Intent(MyActivity.this, MyService.class); bindService(bindIntent, mConnection, Context.BIND_AUTO_CREATE);当然,本例并没有其他进程连接过来,只是利用binder对象作为同步lock的对象而已
因为没有人调用binder的notify,所以它只能老老实实的等待wait函数超时了