即使应用未运行,我希望我的应用在10秒后发出通知。我已使用AlarmManager
但无法在所需时间收到通知。
我当时能够举杯祝酒而不是通知。任何帮助将深表感谢。
这是我的AlarmManager类:
public class AlarmManagerActivity extends Activity {
private AlarmManagerBroadcastReceiver alarm;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_alarm_manager);
alarm = new AlarmManagerBroadcastReceiver();
onetimeTimer();
}
@Override
protected void onStart() {
super.onStart();
}
public void notifyN(){
Intent intent = new Intent(this, NotificationReceiverActivity.class);
PendingIntent pIntent = PendingIntent.getActivity(this, 0, intent, 0);
// Build notification
// Actions are just fake
Notification noti = new Notification.Builder(this)
.setContentTitle("This is a sample notification")
.setContentText("Subject")
.setSmallIcon(R.drawable.ic_launcher)
.setContentIntent(pIntent)
.addAction(R.drawable.ic_action_search, "Call", pIntent)
.addAction(R.drawable.ic_action_search, "More", pIntent)
.addAction(R.drawable.ic_action_search, "And more", pIntent).build();
NotificationManager notificationManager =
(NotificationManager) getSystemService(NOTIFICATION_SERVICE);
// Hide the notification after its selected
noti.flags |= Notification.FLAG_AUTO_CANCEL;
notificationManager.notify(0, noti);
}
public void onetimeTimer(){
Context context = this.getApplicationContext();
if(alarm != null){
alarm.setOnetimeTimer(context);
notifyN();
}else{
Toast.makeText(context, "Alarm is null", Toast.LENGTH_SHORT).show();
}
}
}
这是AlarmManagerBroadcastReceiver:
public class AlarmManagerBroadcastReceiver extends BroadcastReceiver {
final public static String ONE_TIME = "onetime";
@Override
public void onReceive(Context context, Intent intent) {
PowerManager pm = (PowerManager) context
.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(
PowerManager.PARTIAL_WAKE_LOCK, "YOUR TAG");
// Acquire the lock
wl.acquire();
// You can do the processing here update the widget/remote views.
Bundle extras = intent.getExtras();
StringBuilder msgStr = new StringBuilder();
if (extras != null && extras.getBoolean(ONE_TIME, Boolean.FALSE)) {
msgStr.append("One time Timer : ");
}
Format formatter = new SimpleDateFormat("hh:mm:ss a");
msgStr.append("abcs stop the instance" + formatter.format(new Date()));
Toast.makeText(context, msgStr, Toast.LENGTH_LONG).show();
// Release the lock
wl.release();
}
public void setOnetimeTimer(Context context) {
AlarmManager am = (AlarmManager) context
.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
intent.putExtra(ONE_TIME, Boolean.TRUE);
PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 10000, pi);
}
}
答案 0 :(得分:7)
创建一个类(称之为 ScheduledService )并让它扩展 IntentService 。在这个课程中,你会在闹钟响起时做你想做的事。
public class ScheduledService extends IntentService {
public ScheduledService() {
super("My service");
}
@Override
protected void onHandleIntent(Intent intent) {
//Do something, fire a notification or whatever you want to do here
Log.d("debug", "Ring Ring!");
}
}
然后在您启动闹钟的活动中使用以下内容:
AlarmManager mgr = (AlarmManager) YourActivity.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(YourActivity, ScheduledService.class);
PendingIntent pi = PendingIntent.getService(YourActivity, 0, i, 0);
mgr.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + PERIOD, pi);
其中PERIOD
是您希望闹钟响起的时间(以毫秒为单位)。
取消闹钟使用:
if (mgr != null)
mgr.cancel(pi);
最后,要使所有这些工作正常,您需要将 ScheduledService 类注册为服务。 在你的清单中添加这个应用程序:
<application
... />
...
<service android:name=".ScheduledService" >
</service>
</application>
通过这种方式,Android操作系统可以在需要的时候触发警报。即使另一个应用程序正在运行或您的应用程序进程已终止。