2

AlarmManager を繰り返すことができません。私は多くの例を試しましたが、私にとってはうまくいきません。アラームは常に 1 回だけ発火し、その後は何も起こりません。私は自分のデバイス (android 4.4.2) ですべての例を実行しましたが、すべての例はまったく同じように機能します。1回の火だけで、その後は何もありません。誰が私が間違っているのか教えてもらえますか? 最後の例のコードは次のとおりです。

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 以降、繰り返されるすべてのアラームは不正確です。アプリケーションで正確な配達時間が必要な場合は、1 回限りの正確なアラームを使用し、上記のように毎回再スケジュールする必要があります。targetSdkVersion が API 19 より前のレガシー アプリケーションでは、アラームの繰り返しを含め、すべてのアラームが引き続き正確なものとして扱われます。

そして可能な解決策:

注: タイミング操作 (ティック、タイムアウトなど) の場合 > Handler を使用する方が簡単ではるかに効率的です

少なくとも特定の時間間隔がアラーム間で常に経過することを保証するために、アプリケーションで配信時間をドリフトさせたい場合は、1 回限りのアラームを使用し、各アラーム配信を処理するときに次のアラームを自分でスケジュールすることをお勧めします。 .

4

2 に答える 2

-1

コードは Android 4.4.2 API 22 で正常に動作AlarmManagerします。デバイス/API の動作が異なる可能性があります。周波数が非常に短いため、おそらく周波数をオーバーライドしています。本当に6秒間隔が必要ですか? 1 分間かけて周波数を上げてみてください (つまり > 60000)。

于 2015-09-05T19:48:57.153 に答える
-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 に答える