//one time
private void startAlarm1(){
alarmMgr = (AlarmManager)this.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(this, AlarmReceiver.class);
alarmIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
alarmMgr.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime() +
60 * 1000, alarmIntent);
}
上面是我做的第一种方案 关闭屏幕进入休眠状态,程序退出后广播就收不到了。
1.接着就开启Service,想通过后台去自己实现定时提醒的效果。
可是Service 在程序休眠过后,几分钟就退出了。
2.加入唤醒锁,在service onCreate方法中 依然没有效果。
private void acquireWakeLock() {
if (null == mWakeLock) {
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK
| PowerManager.ON_AFTER_RELEASE, Service5.class.getName());
if (null != mWakeLock) {
mWakeLock.acquire();
}
}
}
3.后台开启两个service 一个在主进程中,一个自己再开一个单独进程中的Service。两个进程互相轮询,谁死掉就开启谁。
<service android:name=".Service5" android:process=":service5"></service>
<service android:name=".Service3" android:process="gac.service3"></service>
其中Service3中的线程代码,Service5中的代码雷同
private void initThread(){
new Thread(new Runnable() {
@Override
public void run() {
while (true){
if(!getCurProcessName(getApplicationContext())){
Log.e("gac","重新启动service5");
startService(new Intent(Service3.this, Service5.class));
}
try {
Thread.sleep(1000*60*30);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.e("gac","service3 is running");
}
}
}).start();
}
可是根本检测不到Service重启的情况,后台两个进程的Service同时关闭了。
如果现在做第三方的闹钟应用就没有办法了吗???
我看了一下正点闹钟,后台开启两个进程,里面的service有推送服务,
有闹钟提醒。它的后台进程,休眠时候却没有关掉。
所以我推测它也是用的守护进程做的闹钟服务。
利用AlarmManager做闹钟更不不现实。后台应用进程没了,广播接收器也就收不到广播了。
你的AlarmReceiver是在代码里动态注册,还是在AndroidManifest.xml静态注册的
项目里面集成了极光推送,极光推送可以保持进程常驻,休眠应用退出了,进程还会开着,闹钟广播提醒就不会失效了。折腾了三四天,最后,还是找一个折中的方法。网上找了很多例子,最后效果都不理想、经不住android 休眠的影响。哎!!!
你用的什么机器,很多国内的手机厂商都会对包名做判断的,有闹钟唤醒白名单的。