应用程序多次收到BOOT_COMPLETED并再次重新生成警报

时间:2016-07-12 06:56:37

标签: android android-service android-alarms android-broadcastreceiver

我做了一个应用程序作为教程,了解如何在重新启动手机后重新启动已删除的警报。重新启动后,BroadcastReceiver会收到BOOT_COMPLETED操作并启动一项服务,该服务会重新启动所有警报。警报在调用时会创建通知。在第一次测试后,我收到了预期时间的通知,然后忘记了这个教程应用程序并且没有关闭手机。

但是,我仍然会在屏幕上收到通知,就像应用程序再次重启警报一样。白天我收到了两次,所有人都不清楚为什么。唯一可以启动重启警报的是BOOT_COMPLETED操作。这里出了什么问题?

清单:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.marat.recyclerviewtutorial">

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

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

    // list of activities

    <service android:name=".BootService"/>

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

    <receiver android:name=".RestartAlarmsReceiver" android:enabled="true">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>

</application>

</manifest>

RestartAlarmsReceiver.java

public class RestartAlarmsReceiver extends BroadcastReceiver {

private static final String TAG = "myTag";

@Override
public void onReceive(Context context, Intent intent) {

    if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {

        Intent i = new Intent(context, BootService.class);
        ComponentName service = context.startService(i);

        if (null == service) {
            // something really wrong here
            Log.e(TAG, "Could not start service ");
        }
        else {
            Log.e(TAG, "Successfully started service ");
        }

    } else {
        Log.e(TAG, "Received unexpected intent " + intent.toString());
    }
}
}

BootService.java

public class BootService extends Service {

private static final String TAG = "myTag";

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

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    Log.d(TAG, "onStartCommand");

    Database db = new Database(this);
    db.open();
    ArrayList<ArrayList<String>> data = new ArrayList<ArrayList<String>>();
    data = db.getData();
    db.close();

    Log.d(TAG, "db is openned");

    for (int i=0; i<data.size(); i++) {

        Intent notif = new Intent(this, AlarmBroadcastReceiver.class);
        notif.putExtra("Text", data.get(i).get(2));
        notif.putExtra("Position", data.get(i).get(0));

        int sec = Integer.parseInt(data.get(i).get(3));

        Log.d(TAG, "intent is openned");

        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, Integer.parseInt(data.get(i).get(0)), notif, PendingIntent.FLAG_CANCEL_CURRENT);
        AlarmManager am = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
        am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (sec * 1000), pendingIntent);

        Log.d(TAG, "Alarm is restarted");
    }

    Log.d(TAG, "before returning service");

    return Service.START_STICKY;
}
}

这已经是代码的很大一部分了。但如果您需要我的应用程序的其他部分,我将包括它们。

提前致谢!

1 个答案:

答案 0 :(得分:1)

我认为这是因为START_STICKY。我认为白天系统关闭正在运行的服务以释放资源,START_STICKY强制它重新启动。并在重新启动onStartCommand()时再次触发。

决定可以改为使用IntentService。我不认为有必要在这里使用服务。