0

我的应用程序这部分的目标是始终在后台运行重复警报,每 15 分钟从服务器端机器学习算法中获取一个新的预测,更新应用程序。

我目前已经实现了这种所需行为的框架,以确保我的方法正确。这个骨架应该每 10 秒触发一次祝酒,说明警报正在工作。但是,在我最初设置闹钟后,我再也没有看到其他消息。我还包括对控制台的写入,但这也从未出现过,这让我相信我并不完全了解警报接收器的工作原理。

这是我实例化警报和接收器的主要活动类:

public class MainActivity extends AppCompatActivity implements
        TimePickerFragment.FragmentCallbacks {

    private PendingIntent pendingIntent;
    private AlarmManager manager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Retrieve a PendingIntent that will perform a broadcast
        Intent alarmIntent = new Intent(this, PredictionUpdateReceiver.class);
        pendingIntent = PendingIntent.getBroadcast(this, 0, alarmIntent, 0);
        startAlarm();

        //...
    }

    //...

    public void startAlarm() {
        manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        int interval = 10000;

        manager.setRepeating(AlarmManager.RTC_WAKEUP,
                System.currentTimeMillis(), interval, pendingIntent);
        Toast.makeText(this, "Alarm Set", Toast.LENGTH_SHORT).show();
    }
}

这是我的警报接收器类:

public class PredictionUpdateReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context arg0, Intent arg1) {
        // For our recurring task, we'll just display a message
        Toast.makeText(arg0, "I'm running", Toast.LENGTH_SHORT).show();
        System.out.print("Alarm activated");

    }

}

我已经更新了我的清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.habitabilitystudy"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="11"
        android:targetSdkVersion="22" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <receiver android:name=".PredictionUpdateReceiver"></receiver>
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
4

1 回答 1

5

嗯,你有几个问题。

首先,setRepeating()在 Android 4.4 及更高版本上不准确,atargetSdkVersion为 19 或更高。他们没有说明它实际上是多么“不精确”,所以我不知道你的闹钟什么时候会安排好。

其次,由于未记录的回归,在 Android 5.1+ 上不允许少于一分钟的重复警报周期。一分钟以下的时段将四舍五入为一分钟。因此,无论不精确,您都不会在 10 秒内获得控制权。

最后,下一版 Android 中的变化意味着当设备处于空闲状态(且未充电)或用户很长时间没有返回您的应用(而设备未充电)。这对你现在没有影响,但你可能想考虑一下你对你正在做的事情的态度是否会继续前进。

您可以使用adb shell dumpsys alarm来查看您的闹钟是否已安排。不幸的是,除非他们修复了问题,否则由于不准确问题,它不会告诉您警报何时实际运行。

另外,我建议使用Log.d(),或者在最坏的情况System.out.println()下,而不是System.out.print().

于 2015-06-02T22:39:14.117 回答