AlarmManager没有重复

时间:2015-09-05 18:54:31

标签: android repeatingalarm

我无法重复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的应用程序将   继续发出所有警报,包括重复警报,   确切地对待。

可能的解决方案:

  

注意:对于计时操作(刻度,超时等)&gt;使用Handler

更简单,更有效      

如果您的应用程序希望允许交付时间漂移以确保警报之间始终至少经过一定的时间间隔,那么采取的方法是使用一次性警报,在处理时自行安排下一个警报每次报警发送。

2 个答案:

答案 0 :(得分:-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);

由于

答案 1 :(得分:-1)

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