【问题标题】:Code example for android-wear watch using AlarmManager to update in ambient mode?android-wear 手表使用 AlarmManager 在环境模式下更新的代码示例?
【发布时间】:2016-07-09 21:01:30
【问题描述】:

我正在寻找一个使用 AlarmManager 类在环境模式下更新面部的 android 手表的代码示例。

请提供链接或过去的代码。

谢谢。

【问题讨论】:

    标签: android-studio alarmmanager wear-os watch-face-api


    【解决方案1】:

    我开发了一个 Android 表盘,它还需要定期(例如每小时)运行一个方法。起初,处理程序似乎是一个很好的解决方案,但当 Android Wear 设备进入睡眠状态时,它就会停止工作。然后,我看到了文章Keeping Your App Visible 和“在环境模式下更新内容”部分。但是,要理解它如何应用于表盘并不容易。此处描述的解决方案是在表盘上启用定期更新,即使在 Android Wear 设备进入睡眠状态时也是如此。

    首先将以下字段添加到您的表盘:

    /**
     * Action for the update in ambient mode, per our custom refresh cycle.
     */
    private static final String UPDATE_ACTION = "your.package.action.UPDATE";
    /**
     * Milliseconds between waking processor/screen for updates
     */
    private static final long UPDATE_RATE = TimeUnit.MINUTES.toMillis(30);
    private AlarmManager mUpdateAlarmManager;
    private PendingIntent mUpdatePendingIntent;
    private BroadcastReceiver mUpdateBroadcastReceiver;
    

    在本例中,每 30 分钟更新一次。为了节省电池电量,大多数穿戴式应用程序不应在环境模式下频繁更新屏幕。频繁更新会对电池电量产生重大影响。

    这就是我表盘上的 onCreateEngine() 方法的样子:

    @Override
    public Engine onCreateEngine() {
    
        /* Set an AlarmManager. The AlarmManager calls itself again in the end for a periodic update. */
        mUpdateAlarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    
        Intent ambientUpdateIntent = new Intent(UPDATE_ACTION);
    
        mUpdatePendingIntent = PendingIntent.getBroadcast(
                getApplicationContext(), 0, ambientUpdateIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    
        mUpdateBroadcastReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                Log.d(this.getClass().getName(), "Broadcast received!");
                doMyUpdateAndScheduleNewUpdate();
            }
        };
        IntentFilter filter = new IntentFilter(UPDATE_ACTION);
        registerReceiver(mUpdateBroadcastReceiver, filter);
    
        doMyUpdateAndScheduleNewUpdate();
    
        return new Engine();
    }
    

    doMyUpdateAndScheduleNewUpdate() 是定期执行您想做的任何事情的方法。在该方法调用中还有 scheduleNewAlarm() - 这非常重要,因为它将安排您的后续警报。它应该是这样的:

    /**
     * Schedule the next alarm that will call onReceive of the BroadcastReceiver.
     */
    private void scheduleNewAlarm() {
        // Calculate the next trigger time
        long triggerTimeMs = System.currentTimeMillis() + UPDATE_RATE;
        mUpdateAlarmManager.setExact(
                AlarmManager.RTC_WAKEUP,
                triggerTimeMs,
                mUpdatePendingIntent);
    }
    

    最后,重写 WatchFaceService 的 onDestroy 方法,该方法在服务消失之前被调用。在那里,我们要取消更新 Intent 并取消注册广播接收器。基本上,添加以下代码:

    @Override
    public void onDestroy() {
        // take care of the AlarmManager periodic update
        mUpdateAlarmManager.cancel(mUpdatePendingIntent);
        unregisterReceiver(mUpdateBroadcastReceiver);
        super.onDestroy();
    }
    

    【讨论】:

      【解决方案2】:

      我正在寻找一个 Android 手表的代码示例,它使用 AlarmManager 类在环境模式下更新面部。

      您正在寻找的是Update more frequently Android Wear 指南。

      准备报警管理器 警报管理器启动一个挂起的意图,更新屏幕并安排下一个警报。以下示例展示了如何在活动的 onCreate() 方法中声明警报管理器和挂起的 Intent:

      private AlarmManager mAmbientStateAlarmManager;
      private PendingIntent mAmbientStatePendingIntent;
      
      @Override
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
      
          setAmbientEnabled();
      
          mAmbientStateAlarmManager =
              (AlarmManager) getSystemService(Context.ALARM_SERVICE);
          Intent ambientStateIntent =
              new Intent(getApplicationContext(), MainActivity.class);
      
          mAmbientStatePendingIntent = PendingIntent.getActivity(
              getApplicationContext(),
              0,
              ambientStateIntent,
              PendingIntent.FLAG_UPDATE_CURRENT);
          ...
      }
      

      更新屏幕并安排数据更新 在此示例活动中,警报管理器在环境模式下每 20 秒触发一次。当计时器计时,警报会触发更新屏幕的意图,然后设置下一次更新的延迟。

      以下示例显示如何更新屏幕上的信息并设置下次更新的警报:

      // Milliseconds between waking processor/screen for updates
      private static final long AMBIENT_INTERVAL_MS = TimeUnit.SECONDS.toMillis(20);
      
      private void refreshDisplayAndSetNextUpdate() {
      
          if (isAmbient()) {
              // Implement data retrieval and update the screen for ambient mode
          } else {
              // Implement data retrieval and update the screen for interactive mode
          }
      
          long timeMs = System.currentTimeMillis();
      
          // Schedule a new alarm
          if (isAmbient()) {
              // Calculate the next trigger time
              long delayMs = AMBIENT_INTERVAL_MS - (timeMs % AMBIENT_INTERVAL_MS);
              long triggerTimeMs = timeMs + delayMs;
      
              mAmbientStateAlarmManager.setExact(
                  AlarmManager.RTC_WAKEUP,
                  triggerTimeMs,
                  mAmbientStatePendingIntent);
      
          } else {
              // Calculate the next trigger time for interactive mode
          }
      }
      

      查看完整指南的链接。

      【讨论】:

      • 这段代码似乎是用于安卓穿戴应用而不是手表。
      • 安卓手表是安卓穿戴。您看到“isAmbient()”部分了吗?那是安卓手表的。另请阅读链接
      • 据我所知,测试手表服务环境模式的方法是isInAmbientMode()
      • 他们都是。 isAmbient() 属于 WearableActivity 类,而 isInAmbientMode() 属于 WatchFaceService.Engine 类。
      • 完全正确。我正在寻找显示如何将 AlarmManager 应用于 WatchFaceServiceEngine 类的代码。我遇到过可穿戴应用程序的示例。我正在寻找与表盘代码有关的示例。如果您能告诉我如何调整代码以在表盘上工作,或者向我展示一个指向可在表盘上工作的代码示例的链接,那将对我有很大帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多