微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Android每天每天运行Alarm Manager

如何解决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 举报,一经查实,本站将立刻删除。