我想每x小时运行一次代码,但我也想在代码被触发的时间之间保持一些随机性。
我通过设置和取消一些随机延迟尝试使用AlarmManager,但我没有设法让它工作。
关于我如何做到这一点的任何想法?
答案 0 :(得分:0)
在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.
答案 1 :(得分:0)
我设法找到了这样做的方法。我正在分享代码以防你需要它。
<强>的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);
}
}