Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在重新启动我的设备后,频繁发送短信就是在开机时再次发送短信_Java_Android_Sms_Alarmmanager - Fatal编程技术网

Java 在重新启动我的设备后,频繁发送短信就是在开机时再次发送短信

Java 在重新启动我的设备后,频繁发送短信就是在开机时再次发送短信,java,android,sms,alarmmanager,Java,Android,Sms,Alarmmanager,我经常发送短信息,同时重新启动我的设备,在我们“打开”时再发送一次短信息。在这之后,发送短信息的间隔是正确的。但是,当我们打开设备时,再发送一次短信息 public class BootCompletedIntentReceiver extends BroadcastReceiver { @Override public void onReceive(Context ctxt, Intent i) { try {

我经常发送短信息,同时重新启动我的设备,在我们“打开”时再发送一次短信息。在这之后,发送短信息的间隔是正确的。但是,当我们打开设备时,再发送一次短信息

public class BootCompletedIntentReceiver extends BroadcastReceiver {     

          @Override
          public void onReceive(Context ctxt, Intent i) {
            try {
                scheduleAlarms(ctxt);
            } catch (java.text.ParseException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
          }

          @SuppressLint("SimpleDateFormat")
        static void scheduleAlarms(Context ctxt) throws java.text.ParseException {
              String share_pref_file = "IMS";
                SharedPreferences prefs = ctxt.getSharedPreferences(share_pref_file,
                Context.MODE_PRIVATE);

                String number = prefs.getString("extraSmsNumber", "");
                String message= prefs.getString("extraSmsText", "");
                String mytime = prefs.getString("Mytime", "");
                int year= prefs.getInt("Year", 0);
                int month= prefs.getInt("Month", 0);
                int dmonth= prefs.getInt("DMonth", 0);
                int hour= prefs.getInt("Hour", 0);
                int time= prefs.getInt("Time", 0);
                String nyear = String.valueOf(year);
                String nmonth = String.valueOf(month);
                String ndmonth = String.valueOf(dmonth);
                String nhour = String.valueOf(hour);
                String ntime = String.valueOf(time);
                //int tottime = dmonth +  month +  year + hour + time;
                String newtime = ndmonth + "-" +  nmonth + "-" +  nyear + "/" +  nhour + ":" + ntime;
                SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy/hh:mm");
                Date startDate=null;
                try {
                    startDate = df.parse(newtime);
                    String newDateString = df.format(startDate);

                } catch (ParseException e) {
                    e.printStackTrace();
                }

                 AlarmManager alarmManager =
                            (AlarmManager)ctxt.getSystemService(Context.ALARM_SERVICE);
                        Intent i=new Intent(ctxt, MyAlarmService.class);
                        PendingIntent pendingIntent=PendingIntent.getService(ctxt, 0, i, 0);



                        SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy/hh:mm");
                 //SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/YYYY/HH:mm");
                 String currentLocalTime =sdf.format(new Date());
                    Date startTDate = null;
                    try {
                        startTDate = sdf.parse(currentLocalTime);
                        String newDateString = df.format(startTDate);
                        System.out.println(newDateString);
                    } catch (ParseException e) {
                        e.printStackTrace();
                    }


            if(startDate.compareTo(startTDate) < 0)
            {
                Toast.makeText(
                        ctxt,
                        "Welcome", Toast.LENGTH_LONG).show();   

            }



            if (mytime.equals("Once")) {
                Calendar calendar = Calendar.getInstance();

                calendar.set(year, month,
                        dmonth,
                        hour,
                        time, 0);

                alarmManager.set(AlarmManager.RTC_WAKEUP,
                        calendar.getTimeInMillis(), pendingIntent);
            } else if (mytime.equals("Every 5 Minutes")) {
                Calendar calendar = Calendar.getInstance();

                calendar.set(year, month,
                        dmonth,
                        hour,
                        time, 0);
                alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
                        calendar.getTimeInMillis(), 1000 * 60 * 5,
                        pendingIntent); // Millisec * Second *
                                        // Minute
            } else if (mytime.equals("Every hour")) {
                Calendar calendar = Calendar.getInstance();

                calendar.set(year, month,
                        dmonth,
                        hour,
                        time, 0);
                alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
                        calendar.getTimeInMillis(), 1000 * 60 * 60,
                        pendingIntent); // Millisec * Second *
                                        // Minute
            } else if (mytime.equals("Every day")) {
                Calendar calendar = Calendar.getInstance();

                calendar.set(year, month,
                        dmonth,
                        hour,
                        time, 0);
                alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
                        calendar.getTimeInMillis(),
                        24 * 60 * 60 * 1000, pendingIntent);

            } else if (mytime.equals("Weekly")) {
                Calendar calendar = Calendar.getInstance();

                calendar.set(year, month,
                        dmonth,
                        hour,
                        time, 0);
                alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
                        calendar.getTimeInMillis(), 7 * 24 * 60
                                * 60 * 1000, pendingIntent);

            } else if (mytime.equals("Weekdays(Mon-Fri)")) {

                forWeekdays(ctxt, year, month,
                        dmonth,
                        hour,
                        time);

            } else if (mytime.equals("Weekend")) {
                forWeekend(ctxt, year, month,
                        dmonth,
                        hour,
                        time);

            } else if (mytime.equals("Every month")) {
                Calendar calendar = Calendar.getInstance();

                calendar.set(year, month,
                        dmonth,
                        hour,
                        time, 0);
                alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
                        calendar.getTimeInMillis(), 30 * 24 * 60
                                * 60 * 1000, pendingIntent);

            } else {
                Calendar calendar = Calendar.getInstance();

                calendar.set(year, month,
                        dmonth,
                        hour,
                        time, 0);
                alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
                        calendar.getTimeInMillis(), 365 * 24 * 60
                                * 60 * 1000, pendingIntent);

            }
}

当我们打开时,发生的错误是再发送一条短信

如果我想每5分钟发一次短信,我会在5点0分开始发5.00和5.05,然后在5点07分关掉手机,在5点08分开机,这样5.08也会发短信,然后继续在5.01和5.15分发短信。只有5.08发短信才是问题所在


服务类在重新启动一次后自动启动。

嗨,Karthi,请看一下以下代码:

在设备启动5分钟后启动服务

Calendar cal = Calendar.getInstance(); 
  // Start 5 minutes after boot completed
  cal.add(Calendar.MINUTE, 5); 
  alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP,
            cal.getTimeInMillis(), REPEAT_TIME, pendingIntent);
在此cal.getTimeInMillis()时间之前,不会触发报警

另外,还要执行以下操作:void android.app.AlarmManager.setInexactRepeating(int类型、长triggerAtMillis、长intervalMillis、PendingEvent操作)

服务类在重新启动一次后自动启动。

有很多用户就“重启后服务自动启动”这个问题提出了很多问题

作为一种解决方案,他们中的许多人建议使用START\u NOT\u STICKY返回值onStartCommand()方法(这可能对许多人有效,但对我来说并不适用)

注意:它适用于android 2.3.3和3.0的较低版本,但不适用于4.0和更高版本

通过分析bit,我们知道startID在自动启动和用户调用时似乎给出了不同的值

所以对我来说startID开了个玩笑

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
 if(startId!=2)
        {
               //to do
            }
 return super.onStartCommand(intent, flags, startId);
}
即使在重新启动后也可以跟踪您的时间

我不确定android是否提供了跟踪时间的API,但它可以通过简单的数学计算实现

为此,您需要跟踪上次报警触发的时间(使用SharedReference以毫秒为单位存储日期/时间)

并在广播接收器类中执行上述操作,以执行“BOOT_COMPLETED”操作,并使用生成的时间设置警报

public static void setPendingIntent(Context ctx,long time,long period){
        AlarmManager alarmManager=
                (AlarmManager)ctx.getSystemService(Context.ALARM_SERVICE);
        Intent myIntent = new Intent(ctx,
                MyAlarmService.class);
        PendingIntent pendingIntent = PendingIntent.getService(ctx, 0, myIntent, 0);
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
                time, period , pendingIntent);

        Toast.makeText(ctx, "repeating --> "+time, Toast.LENGTH_LONG).show();
    }
注意:这不是解决此问题的标准答案,但目前它对我有效,希望它可以帮助您解决此问题

注意:也在寻找更好的答案…

只需从manifest.xml中删除此权限即可
Just Remove this permission from manifest.xml

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>

and also remove 

<intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"> </action>
    </intent-filter>

from <receiver> Tag in manifest.xml 
并删除 manifest.xml中的from标记
在设备启动5分钟后启动您的服务“出现的错误是在我们打开时再发送一条短信”您在哪个android版本上遇到此问题?@vinaykumar我正在使用minsdk version=8和targetsdk version=“17”@KarthickM-OS版本?
public static void setPendingIntent(Context ctx,long time,long period){
        AlarmManager alarmManager=
                (AlarmManager)ctx.getSystemService(Context.ALARM_SERVICE);
        Intent myIntent = new Intent(ctx,
                MyAlarmService.class);
        PendingIntent pendingIntent = PendingIntent.getService(ctx, 0, myIntent, 0);
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
                time, period , pendingIntent);

        Toast.makeText(ctx, "repeating --> "+time, Toast.LENGTH_LONG).show();
    }
Just Remove this permission from manifest.xml

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>

and also remove 

<intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"> </action>
    </intent-filter>

from <receiver> Tag in manifest.xml