当后台活动时,AlarmManager不起作用

时间:2013-11-19 19:38:42

标签: android background android-activity broadcastreceiver alarmmanager

在我的应用程序中,我每天都使用AlarmManager每天发送一次keep-alive。 我正在使用以下代码启动AlaramManager

        Calendar calendar = DateUtils
            .getNextKeepAliveTime(keepAliveHours, keepAliveMinutes);
    Intent intent = new Intent(this, AlarmReceiver.class);
    PendingIntent sender = PendingIntent.getBroadcast(getApplicationContext(),
            ALARM_REQUEST_CODE, intent, 0); //  PendingIntent.FLAG_UPDATE_CURRENT);

    // Get the AlarmManager service
    Log.d(TAG, "cal: " + calendar.toString());
    AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
    long diff = calendar.getTimeInMillis() - System.currentTimeMillis();
    if(diff < 0) diff = AlarmManager.INTERVAL_FIFTEEN_MINUTES;
    am.setInexactRepeating(AlarmManager.RTC_WAKEUP, diff, AlarmManager.INTERVAL_DAY, sender);

当活动进入后台时,接收器AlarmReceiver不会收到任何事件。但它在前台活动时成功运作。 我的清单中的接收器声明是 -

<receiver android:name="MainActivity$AlarmReceiver" android:enabled="true" />

清单是

<?xml version="1.0" encoding="utf-8"?>

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="8" />

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.INTERNET" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="com.yachtdroid.ba.MainActivity"
        android:label="@string/app_name"
        android:launchMode="singleInstance" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name="com.yachtdroid.ba.ui.Settings" >
    </activity>
    <receiver android:name="MainActivity$ChargingOnReceiver" android:enabled="true">
        <intent-filter>
        <action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
        <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
    </intent-filter>
    </receiver>
    <service android:name="com.yachtdroid.ba.services.MailSenderService" />
    <service android:name="com.yachtdroid.ba.services.SmsSender" />

    <activity android:name="com.yachtdroid.ba.ui.YDSiteView" />
    <activity
        android:name="com.yachtdroid.ba.ui.BatteryAlertDialog"
        android:theme="@style/NoTitleDialog" />
    <activity
        android:name="com.yachtdroid.ba.ui.ActivityLog"
        android:theme="@style/NoTitleDialog" />
    <receiver android:name="MainActivity$AlarmReceiver" android:enabled="true" />
        <!-- intent-filter>
            <action android:name="alarm_action"/>
        </intent-filter>
    </receiver -->
</application>

接收者代码是

    public static class AlarmReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(TAG, intent.getExtras().toString());
        if (!inForeground) {
            Log.d(TAG, "*** Move app to front!");
            Intent it = new Intent("intent.my.action");
            it.setComponent(new ComponentName(context.getPackageName(),
                    MainActivity.class.getName()));
            it.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                    | Intent.FLAG_ACTIVITY_CLEAR_TOP);
            context.getApplicationContext().startActivity(it);
        }           
        try {
            Toast.makeText(context, "alarm message", Toast.LENGTH_SHORT).show();
            MainActivity.instance.sendKeepALive();
        } catch (Exception e) {
            Toast.makeText(
                    context,
                    "There was an error somewhere, but we still received an alarm",
                    Toast.LENGTH_SHORT).show();
            e.printStackTrace();
        }
    }
}

如何解决? 谢谢, 的Eyal。

1 个答案:

答案 0 :(得分:0)

尝试从Activity中删除广播接收器的代码,制作另一个java文件并将其放在那里并根据其修改清单

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

而不是

<receiver android:name="MainActivity$AlarmReceiver" android:enabled="true" />