【问题标题】:AlarmManager not working in Android wearAlarmManager 在 Android Wear 中不起作用
【发布时间】:2016-08-25 06:26:18
【问题描述】:

我正在尝试从我的 Android Wear 项目中调用 AlarmManager。但由于某些原因,它失败了。以下是我的相同代码。我确定我在 AlarmReceiver 中调用 setAlarm 方法(我的日志正在打印),但之后没有任何反应。我的目标是每 30 秒发出一次警报。当调用 AlarmReceiver onReceive 时。 SendBroadcast 到我的服务,然后将消息发送到服务器。我在这里做错了什么。

清单详情:

<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

在应用程序内

<receiver android:name=".alarm.AlarmReceiver" />
        <receiver
            android:name=".alarm.SampleBootReceiver"
            android:enabled="false">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>

报警管理器:

public class AlarmReceiver extends WakefulBroadcastReceiver {

    private static final String TAG = "AlarmReceiver";

    // The app's AlarmManager, which provides access to the system alarm services.
    private AlarmManager alarmMgr;
    // The pending intent that is triggered when the alarm fires.
    private PendingIntent alarmIntent;

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(TAG,"AlarmReceiver onReceive*******");
        Intent sensorIntent = new Intent("sensor");
        LocalBroadcastManager.getInstance(context).sendBroadcast(sensorIntent);
    }

    public void setAlarm(Context context) {
        Log.d(TAG,"Alarm Manager started");
        alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(context, AlarmReceiver.class);
        alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);

        alarmMgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                System.currentTimeMillis()+1000,60000,alarmIntent);

        ComponentName receiver = new ComponentName(context, SampleBootReceiver.class);
        PackageManager pm = context.getPackageManager();

        pm.setComponentEnabledSetting(receiver,
                PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                PackageManager.DONT_KILL_APP);

    }
}

SampleBootReceiver:

public class SampleBootReceiver extends BroadcastReceiver {
    AlarmReceiver alarm = new AlarmReceiver();
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED"))
        {
            alarm.setAlarm(context);
        }
    }
}

【问题讨论】:

    标签: android broadcastreceiver alarmmanager wear-os


    【解决方案1】:

    您可能需要检查Creating and Running a Wearable AppPackaging Wearable Apps 以确保您能够将您的手持设备与您的穿戴设备配对。

    在穿戴式开发中,手持设备和可穿戴设备之间的正确通信/配对对于发送和接收消息非常重要。使用MessageApi,向可穿戴设备发送消息以开始活动。要收到收到消息的通知,请实现MessageListener 接口以提供消息事件的侦听器。

    您还可以看到我的回答 here 和另一个相关的 SO 问题 here。这里还有一个关于Wearable NotificationAndroid Wear Development 的教程。

    希望对你有帮助!

    【讨论】:

    • 我的 Android Wear 应用和移动应用在来回发送消息时没有任何问题。我需要对从手表发送到手机的消息进行计时。对于计时,目前我正在使用 Handler.postDelayed ,它工作得很好,但我想一直发送消息,即使 CPU 进入睡眠状态也是如此。所以我选了这个。
    【解决方案2】:

    从 API 级别 19 开始,警报传递是不精确的:操作系统将切换警报以最大程度地减少唤醒和电池使用。

    在低功耗模式下的可穿戴设备上尤其如此。

    为保证交付使用setExactAndAllowWhileIdle

    类似于setExact(int, long, PendingIntent),但即使系统处于低功耗空闲模式,也允许执行此警报。如果您不需要准确安排警报但仍需要在空闲时执行,请考虑使用setAndAllowWhileIdle(int, long, PendingIntent)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      相关资源
      最近更新 更多