如何解决Android每天每天运行Alarm Manager
我的Android闹钟有问题。它仅在计划的时间运行一次,以后几天将不再运行。
我想知道的是,一旦执行onReceive方法,是否有必要重新配置警报。
此代码包含在Principal(MainActivity)onCreate()方法中:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//other initializations
Calendar today = Calendar.getInstance();
today.set(Calendar.HOUR_OF_DAY,22);
today.set(Calendar.MINUTE,minutos);
today.set(Calendar.SECOND,0);
Utils.setAlarm(alarmID,today.getTimeInMillis(),Principal.this);
}
这是Principal的方法:
public static class Utils {
@SuppressLint("NewApi")
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
public static void setAlarm(int i,Long timestamp,Context ctx) {
AlarmManager alarmManager = (AlarmManager) ctx.getSystemService(ALARM_SERVICE);
Intent alarmIntent = new Intent(ctx,AlarmReceiver.class);
PendingIntent pendingIntent;
pendingIntent = PendingIntent.getbroadcast(ctx,i,alarmIntent,PendingIntent.FLAG_ONE_SHOT);
alarmIntent.setData((Uri.parse("custom://" + System.currentTimeMillis())));
alarmManager.setAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,timestamp,pendingIntent);
}
}
public static class AlarmReceiver extends broadcastReceiver {
@Override
public void onReceive(Context context,Intent intent) {
Log.d("check"," ALARM RECEIVED!!!");
ClientTCP2 myATaskYW = new ClientTCP2();
myATaskYW.execute(context);
}
}
我应该使用AlarmReceiver的onReceive方法重新配置警报吗?
解决方法
我应该使用AlarmReceiver的onReceive方法重新配置警报吗?
是的。 setAndAllowWhileIdle
仅触发一次警报。您将需要再次致电setAndAllowWhileIdle
来设置下一个警报。
朱利安·奥维耶多(JuliánOviedo) 这是我的应用程序中的示例代码,可能对您有用。
AlarmReceiver.java
public class AlarmReceiver extends BroadcastReceiver {
private static final String CHANNEL_ID = AlarmManager.class.getSimpleName();
@Override
public void onReceive(Context context,Intent intent) {
Intent notificationIntent = new Intent(context,NotificationActivity.class);
Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
if (vibrator != null) {
vibrator.vibrate(2000);
}
TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
stackBuilder.addParentStack(NotificationActivity.class);
stackBuilder.addNextIntent(notificationIntent);
PendingIntent pendingIntent = stackBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT);
Notification.Builder builder = new Notification.Builder(context);
Notification notification = builder.setContentTitle("Android")
.setContentText("Android MIT class")
.setTicker("New Message Alert!")
.setSmallIcon(R.mipmap.ic_launcher)
.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
.setContentIntent(pendingIntent).build();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
builder.setChannelId(CHANNEL_ID);
}
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel(
CHANNEL_ID,"NotificationDemo",IMPORTANCE_DEFAULT
);
if (notificationManager != null) {
notificationManager.createNotificationChannel(channel);
notificationManager.notify(1,notification);
}
} else {
if (notificationManager != null) {
notificationManager.notify(1,builder.build());
}
}
}
}
我用活动称呼我的阿拉兰
public class MainActivity extends AppCompatActivity {
int min,hour;
AlarmManager alarmManager;
Button btn_pickAlarm,btn_setAlarm;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_pickAlarm = findViewById(R.id.pick_alarm);
btn_setAlarm = findViewById(R.id.set_Alarm);
//for huawei background service enable
if ("huawei".equalsIgnoreCase(android.os.Build.MANUFACTURER)) /*!sp.getBoolean("protected",false)*/ {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("headline").setMessage("text")
.setPositiveButton("protected",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface,int i) {
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.huawei.systemmanager","com.huawei.systemmanager.optimize.process.ProtectActivity"));
startActivity(intent);
//sp.edit().putBoolean("protected",true).commit();
}
}).create().show();
}
btn_pickAlarm.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Calendar mcurrentTime = Calendar.getInstance();
hour = mcurrentTime.get(Calendar.HOUR_OF_DAY);
min = mcurrentTime.get(Calendar.MINUTE);
TimePickerDialog mTimePicker;
mTimePicker = new TimePickerDialog(MainActivity.this,new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker timePicker,int selectedHour,int selectedMinute) {
hour = selectedHour;
min = selectedMinute;
Toast.makeText(MainActivity.this,"Alarm set at: " + hour + ":" + min,Toast.LENGTH_SHORT).show();
}
},hour,min,true);//Yes 24 hour time
mTimePicker.setTitle("Select Time");
mTimePicker.show();
}
});
btn_setAlarm.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Calendar wakeupcall = Calendar.getInstance();
Calendar now = Calendar.getInstance();
long _alarm;
alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
PendingIntent broadcast;
Intent notificationIntent = new Intent(getApplicationContext(),AlarmReceiver.class);
broadcast = PendingIntent.getBroadcast(getApplicationContext(),12341234,notificationIntent,PendingIntent.FLAG_UPDATE_CURRENT);
wakeupcall.set(Calendar.HOUR_OF_DAY,hour);
wakeupcall.set(Calendar.MINUTE,min);
wakeupcall.set(Calendar.SECOND,0);
wakeupcall.set(Calendar.MILLISECOND,0);
if (wakeupcall.getTimeInMillis() <= now.getTimeInMillis())
_alarm = wakeupcall.getTimeInMillis() + (AlarmManager.INTERVAL_DAY + 1);
else
_alarm = wakeupcall.getTimeInMillis();
if (alarmManager != null) {
if (Build.VERSION_CODES.KITKAT <= SDK_INT && SDK_INT < Build.VERSION_CODES.M) {
alarmManager.setExact(AlarmManager.RTC_WAKEUP,_alarm,broadcast);
} else if (SDK_INT >= Build.VERSION_CODES.M) {
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,broadcast);
}
}
}
});
}
}
我希望这个样本能为您带来好运。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。