2

我不能让 AlarmManager 重复。我尝试了很多例子,但对我来说它们不起作用。警报总是只触发一次,然后什么也没有发生。我在我的设备(android 4.4.2)上运行了所有示例,所有示例的工作方式完全相同。只是一场火灾,然后什么都没有。谁能告诉我我做错了什么?这是最后一个示例的代码: 接收器:

package net.desme.alarmtest;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.PowerManager;
import android.widget.Toast;

public class Alarm extends BroadcastReceiver {
    public void onReceive(Context context, Intent intent)
    {
        PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
        PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "");
        wl.acquire();
        Toast.makeText(context, "Alarm !!!!!!!!!!", Toast.LENGTH_SHORT).show(); // For example
        wl.release();
    }

    public void setAlarm(Context context)
    {
        AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        Intent i = new Intent(context, Alarm.class);
        PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
        am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 6, pi); // Millisec * Second * Minute
    }

    public void cancelAlarm(Context context)
    {
        Intent intent = new Intent(context, Alarm.class);
        PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        alarmManager.cancel(sender);
    }
}

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="net.desme.alarmtest" >

    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".AlarmManagerActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <receiver android:name=".Alarm" android:process=":remote" />
    </application>

</manifest>

活动:

package net.desme.alarmtest;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;

public class AlarmManagerActivity extends Activity {
    Alarm alarm = new Alarm();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_alarm_manager);

        findViewById(R.id.start_repeating).setOnClickListener(mStartRepeatingListener);
        findViewById(R.id.stop_repeating).setOnClickListener(mStopRepeatingListener);
    }

    private View.OnClickListener mStartRepeatingListener = new View.OnClickListener() {
        public void onClick(View v) {
            alarm.setAlarm(getApplicationContext());
        }
    };

    private View.OnClickListener mStopRepeatingListener = new View.OnClickListener() {
        public void onClick(View v) {
            alarm.cancelAlarm(getApplicationContext());
        }
    };
}

我也试过这些:

https://developer.android.com/training/scheduling/alarms.html http://www.coderzheaven.com/2011/07/31/how-to-setup-a-repeating-alarm-in-android/

还有更多,但我不能发布它,因为红色提示说我需要至少 10 名声望

编辑

问题是在 API 19+ 中所有的警报都是不准确的。这是文档中的内容:

注意:从 API 19 开始,所有重复警报都是不准确的。如果您的应用程序需要精确的交付时间,那么它必须使用一次性精确警报,并如上所述重新安排每次。targetSdkVersion 早于 API 19 的旧版应用程序将继续将其所有警报(包括重复警报)视为准确。

以及可能的解决方案:

注意:对于计时操作(滴答声、超时等)> 使用 Handler 更容易、更高效

如果您的应用程序希望允许传递时间漂移以保证警报之间总是至少经过一定的时间间隔,那么采取的方法是使用一次性警报,在处理每个警报传递时自己安排下一个.

4

2 回答 2

-1

这是以 10 秒间隔重复启动警报的解决方案,但它的待处理意图不同,因为我使用此方法在 10 秒间隔后启动服务,因此根据您的要求使用它,

 Calendar cal = Calendar.getInstance();
    cal.add(Calendar.SECOND, 10);
    Intent intent = new Intent(Main.this, Service_class.class);
    Intent i = new Intent(context, Alarm.class);
        PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
    AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),
            36000 * 1000, pintent);

谢谢

于 2015-09-05T19:16:47.847 回答
-1

您的代码在 Android 4.4.2 API 22 中运行良好。也许AlarmManager您的设备/API 上的行为有所不同;也许会覆盖频率,因为它太短了。你真的需要6秒的间隔吗?尝试在一分钟内增加频率,即 > 60000。

于 2015-09-05T19:48:57.153 回答