gpt4 book ai didi

带广播接收器的 Android 警报管理器

转载 作者:行者123 更新时间:2023-11-30 01:53:12 27 4
gpt4 key购买 nike

您好,我有我的警报管理器来显示通知。问题是一旦触发警报并显示通知,当执行 MainActivity(super.onCreate) 的代码时,它总是触发通知。

这是执行警报的我的 MainActivity。

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

initAlarm();

}

private void initAlarm(){

Calendar calendar = Calendar.getInstance();

calendar.set(Calendar.MONTH, 8);
calendar.set(Calendar.YEAR, 2015);
calendar.set(Calendar.DAY_OF_MONTH, 21);

calendar.set(Calendar.HOUR_OF_DAY, 15);
calendar.set(Calendar.MINUTE, 45);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.AM_PM,Calendar.PM);

//Creo un intent que ejecutara el BroadcastReceiver
Intent myIntent = new Intent(MainActivity.this, AlarmBroadcastReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, myIntent, PendingIntent.FLAG_UPDATE_CURRENT);

AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC, calendar.getTimeInMillis(), pendingIntent);
}

这里是 AlarmBroadcastReceiver,它应该只在 AlarmManager 的时间到期时被调用。

public class AlarmBroadcastReceiver extends BroadcastReceiver{

@Override
public void onReceive(Context context, Intent intent) {
Intent startIntent = new Intent(context, AlarmService.class);
context.startService(startIntent);
}
}

BroadcastReceiver发起的服务:​​

public class AlarmService extends Service{
@Override
public int onStartCommand(Intent intent, int flags, int startId) {

generarNotificacion();

return Service.START_NOT_STICKY;
}

@Override
public IBinder onBind(Intent intent) {
return null;
}

public void generarNotificacion(){

Intent resultIntent = new Intent(this.getApplicationContext(), MainActivity.class);

android.support.v4.app.NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.logo)
.setContentTitle(getResources().getString(R.string.app_name))
.setContentText(getResources().getString(R.string.texto_notificacion));

PendingIntent resultPendingIntent =
PendingIntent.getActivity(
this,
0,
resultIntent,
PendingIntent.FLAG_UPDATE_CURRENT
);

mBuilder.setContentIntent(resultPendingIntent);

// Sets an ID for the notification
int mNotificationId = 001;

// Gets an instance of the NotificationManager service
NotificationManager mNotifyMgr =
(NotificationManager) getSystemService(NOTIFICATION_SERVICE);

// Builds the notification and issues it.
mNotifyMgr.notify(mNotificationId, mBuilder.build());
}

}

最后我将此代码添加到 manifest.xml

<application
android:allowBackup="true"
android:icon="@mipmap/logo"
android:label="@string/app_name"
android:theme="@style/AppTheme" >

<service android:name=".AlarmService"
android:enabled="true" />

<receiver android:name=".AlarmBroadcastReceiver"/>

...

</application>

最佳答案

这是显而易见的。您在 onCreate 中调用 initAalarm()。要了解使用您的代码执行以下测试用例:

假设当前日期和时间是 2015 年 9 月 20 日下午 1:00 并且闹钟设置为 future 日期,例如当前时间后 15 分钟,即 2015 年 9 月 20 日下午 1:15
现在要测试它,您可以等待时间到达或更改系统日期时间。执行此操作后,您将看到通知同时被触发。现在不要更改 initAlarm() 中的任何内容,关闭 Activity 并再次启动它,您将再次看到通知。这背后的原因是如果警报设置为系统时间的某个过去日期,那么它会立即被触发。

参见 Alarm Manager's set method 的文档

关于带广播接收器的 Android 警报管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32697295/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com