【问题标题】:Android - AlarmManager set random delays between alarmsAndroid - AlarmManager 设置闹钟之间的随机延迟
【发布时间】:2017-09-17 08:04:11
【问题描述】:

我想每 x 小时运行一次代码,但我也想在代码被触发的时间之间保持一些随机性。

我通过设置和取消一些随机延迟来尝试使用 AlarmManager,但我没有设法让它工作。

关于如何做到这一点的任何想法?

【问题讨论】:

    标签: android alarmmanager


    【解决方案1】:

    在你的 manifest.xml 中添加这个

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

    根据 developer.android

       Note: Beginning with API 19 (KITKAT) alarm delivery is inexact: the OS will shift alarms in order to minimize wakeups and battery use. 
    There are new APIs to support applications which need strict delivery guarantees; see setWindow(int, long, long, PendingIntent) and setExact(int, long, PendingIntent). 
    Applications whose targetSdkVersion is earlier than API 19 will continue to see the previous behavior in which all alarms are delivered exactly when requested.
    

    来自https://developer.android.com/reference/android/app/AlarmManager.html#setExact(int, long, android.app.PendingIntent)

    【讨论】:

    • 我编辑了问题以显示我的接收器。谢谢
    • 添加“.”在安卓名称之前。这可能是问题所在。顺便说一句,意图做什么?
    • “。”我认为这没有任何区别。 Intent 是对要执行的操作的描述
    • 我从未使用显式操作来调用广播接收者。意图警报class= 新意图(上下文,BroadcastReceiverAux.class);尝试以这种方式设置意图。
    • 顺便说一句,您知道“设置”方法实际上是在设置不精确的警报,对吗?您设置为 3 秒后,但它可能会在几分钟后调用以节省电池。尝试设置“setexact”以检查您的应用中的其他所有内容是否正确。
    【解决方案2】:

    我设法找到了这样做的方法。我正在分享代码,以防你也需要它。

    AndroidManifest.xml

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.tribta.test">
    
        <uses-permission android:name="android.permission.WAKE_LOCK"/>
        <uses-permission android:name="android.permission.VIBRATE"/>
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="test"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <receiver android:process=":remote" android:name=".Alarm"></receiver>
            <service
                android:name=".MyService"
                android:enabled="true"
                android:process=":my_service" >
            </service>
        </application>
    </manifest>
    

    MainActivity.java

    package com.tribta.test;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    
    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState){
    
            super.onCreate(savedInstanceState);
            Intent serviceIntent = new Intent(this,MyService.class);
            this.startService(serviceIntent);
        }
    
        @Override
        public void onDestroy(){
            super.onDestroy();
        }
    }
    

    MyService.java

    package com.tribta.test;
    
    import android.app.Service;
    import android.content.Intent;
    import android.os.IBinder;
    
    public class MyService extends Service
    {
        Alarm alarm = new Alarm();
        public void onCreate()
        {
            super.onCreate();
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId)
        {
            alarm.setAlarm(this);
            return START_STICKY;
        }
    
        @Override
        public void onStart(Intent intent, int startId)
        {
            alarm.setAlarm(this);
        }
    
        @Override
        public IBinder onBind(Intent intent)
        {
            return null;
        }
    }
    

    Alarm.java,您可以在其中放置您的代码:

    package com.tribta.test;
    
    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.os.Vibrator;
    import android.widget.Toast;
    
    import java.util.Random;
    
    public class Alarm extends BroadcastReceiver
    {
        @Override
        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();
    
            // Put here YOUR code.
            Toast.makeText(context, "Alarm !!!!!!!!!!", Toast.LENGTH_LONG).show(); // For example
    
            Vibrator v = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
            v.vibrate(300); // Vibrate for 300 milliseconds
    
            cancelAlarm(context);
            setAlarm(context);
    
            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);
    
            Random r = new Random();
            int ri = r.nextInt(7 - 1) + 1; // random integer between 7 (inclusive) and 1 (exclusive),
            int delay = 1000 * 60 * 60 * ri; // Millisec * Second * Minute * hours
    
            am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + delay, pi);
        }
    
        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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-24
      • 1970-01-01
      • 2011-12-29
      • 1970-01-01
      相关资源
      最近更新 更多