我正在使用AlarmManager
来安排我的应用中的内容,用户将选择时间,然后我将服务等级的intent
传递给AlarmManager
,这将触发屏幕打开后的一定时间后发出警报。
它正常工作但屏幕锁定时,不会触发警报。
我在服务中使用 wakelock 和部分唤醒锁定选项,但它无效。当我使用完全唤醒锁然后它正常工作,那么部分锁定选项有什么问题?
下面的代码。
public void schedule(View v) {
AlarmManager localAlarmManager = (AlarmManager)getSystemService("alarm");
Calendar localCalendar = Calendar.getInstance();
localCalendar.set(Calendar.HOUR_OF_DAY, 12);
localCalendar.set(Calendar.MINUTE, 10);
localCalendar.set(Calendar.SECOND, 0);
Intent localIntent = new Intent(getBaseContext(), Backupservice.class);
localIntent.putExtra("startservice", "true");
PendingIntent localPendingIntent = PendingIntent.getService(getBaseContext(), 15, localIntent, 134217728);
localAlarmManager.cancel(localPendingIntent);
long l = localCalendar.getTimeInMillis();
System.out.println("schtm:" + localCalendar.getTimeInMillis() +"currenttm:"+System.currentTimeMillis());
localAlarmManager.setRepeating(AlarmManager.RTC_WAKEUP, l,1800000, localPendingIntent);
}
public class Backupservice extends Service {
public Backupservice(){
// cnt=context;
}
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
miscallsettings=getSharedPreferences("MyPref", MODE_PRIVATE);
Log.i("Backupservice", "Service created");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
super.onStartCommand(intent, flags, startId);
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
// PowerManager.ACQUIRE_CAUSES_WAKEUP |
wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK |
PowerManager.ON_AFTER_RELEASE, "ggg");
wl.acquire();
save();
return super.onStartCommand(intent, flags, startId);
}
@SuppressWarnings("unchecked")
private void save() {
try {
// here I am writing the logic
wl.release();
} catch(Exception e) {
}
}
@Override
public void onDestroy() {
try {
wl.release();
} catch(Exception e) {
}
}
}
答案 0 :(得分:2)
我已经看到这种实现的方式,它对我有用,就是使用BroadcastReceiver
作为警报事件。只要方法运行,此广播接收器的onReceive
方法就可以保证唤醒设备。
我不确定这是不是最好的方式,但我的情况类似,这是我所要做的:
在schedule方法中设置闹钟以发送警报广播意图:
AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent alarmBcstRec = new Intent(context, MyAlarmBroadcastReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(context, 0, alarmBcstRec, 0);
// Replace the settings with yours here...
am.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime()+MyAlarmBroadcastReceiver.INTERVAL_FIVE_MINUTES, MyAlarmBroadcastReceiver.INTERVAL_FIVE_MINUTES, pi);
启动服务的警报广播接收器。顺便说一句,在服务的onStartCommand方法中我获取了一个唤醒锁,我不确定它是否适合这样做,但它对我有用。我在服务完成后发布它。
public class MyAlarmBroadcastReceiver extends BroadcastReceiver {
public static final long INTERVAL_FIVE_MINUTES = 1000 * 60 * 5;
@Override
public void onReceive(Context context, Intent intent) {
Intent service = new Intent(context, YourService.class);
context.startService(service);
}
}
在我添加的Manifest
中:
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<receiver android:name="com.xxx.MyAlarmBroadcastReceiver"
android:enabled="true">
</receiver>
在我的情况下,我还有一个BroadcastReceiver
BOOT_COMPLETE
来启动系统启动时的调度。在这种情况下,我从Boot广播接收器设置了与调度方法所示相同的代码(将警报设置为广播到MyAlarmBroadCastReceiver
)。
答案 1 :(得分:0)
检查我的代码:
AlarmManager alarmManager = (AlarmManager) context
.getSystemService(Context.ALARM_SERVICE);
PendingIntent pendingIntent = getNotifyPendingIntent();
alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
pendingIntent);
private PendingIntent getNotifyPendingIntent() {
Intent intent = new Intent(context, AlarmExpireService.class);
return PendingIntent.getService(context, 0, intent, 0);
}
现在AlarmExpireService是:
public class AlarmExpireService extends Service {
// private static final String TAG = "AlarmExpireService";
private static final String TAG = "AlarmExpireService";
@Override
public void onCreate() {
super.onCreate();
Intent intent = new Intent(this, AlarmAlert.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_NO_USER_ACTION);
startActivity(intent);
// generateNotification(this, "Hello");
// Toast.makeText(this, "Alarm ring", Toast.LENGTH_LONG).show();
stopSelf();
}
}
当屏幕锁定时,此标志对于trigeer活动非常有用。
答案 2 :(得分:0)
尝试在后台应用管理设置中允许您的应用。