2014-07-11 63 views
4

Android Wear生态系统似乎围绕着用户将与之交互的快速任务构建,然后关闭。这对大多数应用程序来说都很好用,但是对于覆盖长时间运行任务的应用程序又该如何处理,并且在手表睡觉时不应该自动关闭?Android Wear上的长时间运行应用程序

我的具体案例:Swing by Swing Golf GPS。首选操作是让应用程序保持活动状态,并在屏幕由于用户操作而唤醒时显示。一次性使用的寿命将在2至4小时之间。

有什么方法可以使Android Wear设备上的应用程序前端和中心保持一段时间?

回答

0

OnPause()方法在设备进入休眠或对话框出现在应用程序上时调用。一个或两个活动可以在这里完成,但它们应该保持合理的轻量级以防止延长的用户等待时间。

+1

所以你说最佳做法是在手表进入睡眠状态时添加通知?并从该通知用户将重新进入我们的应用程序? –

+1

@TerrenceGiggy 不一定。这是一个选项,是的,但请记住,许多重量级的东西需要由关联的设备来完成。您可以使用'OnPause()'方法向相关设备发送通知,然后使用'NotificationCompat.Builder'为您的设备创建一个唤醒通知,它将再次在Wear设备上启动应用程序。您需要一种方法将应用程序的数据发送回设备。 – Wolfish

+1

@TerrenceGiggy 因此: 第1步:用户启动应用程序 第2步:应用程序查找完成的动作(高尔夫球手的挥杆)。 第3步:应用程序将数据发送到Android设备。 步骤4:磨损装置进入睡眠状态。 第5步:用户查看挥杆。 请记住,2-4小时的清醒会杀死磨损电池的寿命,这就是为什么我建议这种方法。 – Wolfish

2

所以,这里是我想出了一个解决方案:

建立一个PendingIntent通知打开主Activity。还传递它的删除行为的意图,所以我们知道用户是否已经解雇它。

public class SbsNotificationHelper { 
    private static final String NOTIFICATION_DELETED_INTENT = "sbs.notificationDeleted"; 
    private static boolean _isNotificationActive = false; 

    /** Public static methods */ 

    public static NotificationCompat.Builder buildRoundInProgressNotification(Context context) throws Throwable { 
     Intent viewIntent = new Intent(context, SbsRoundActivity.class); 
     PendingIntent viewPendingIntent = PendingIntent.getActivity(context, 0, viewIntent, 0); 

     context.registerReceiver(_broadcastReceiver, new IntentFilter(NOTIFICATION_DELETED_INTENT)); 
     _isNotificationActive = true; 

     Intent deleteIntent = new Intent(NOTIFICATION_DELETED_INTENT); 
     PendingIntent deletePendintIntent = PendingIntent.getBroadcast(context, 0, deleteIntent, 0); 

     NotificationCompat.Action action = new NotificationCompat.Action.Builder(R.drawable.circle_button, "", viewPendingIntent).build(); 

     Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.bottom_bg); 

     NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context) 
       .setSmallIcon(R.drawable.iphone_57x57) 
       .setLargeIcon(bitmap) 
       .setContentTitle("Golf GPS") 
       .setContentText("Swing by Swing") 
       .addAction(action) 
       .setDeleteIntent(deletePendintIntent) 
       .extend(new NotificationCompat.WearableExtender() 
         .setContentAction(0)); 

     return notificationBuilder; 
    } 

    public static boolean isNotificationActive() { 
     return _isNotificationActive; 
    } 

    /** BroadcastReceiver */ 

    private static final BroadcastReceiver _broadcastReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      _isNotificationActive = false; 
     } 
    }; 

} 

使用onStop()而不是onPause()发出通知。这样,如果您的应用中有多项活动,则可以展示它们(仅导致ActivityonPause())。

@Override 
protected void onStop() { 
    super.onStop(); 

    int notificationId = 001; 
    NotificationCompat.Builder notificationBuilder = SbsNotificationHelper.buildRoundInProgressNotification(context); 

    NotificationManagerCompat notificationManagerCompat = NotificationManagerCompat.from(this); 
    notificationManagerCompat.notify(notificationId, notificationBuilder.build()); 
} 

而且使用的通知您WearableListenerService里面,如果你用在手持设备上的应用程序进行通信。因此,当您的应用程序打开时,可以弹出通知并轻松访问该通知。

@Override 
public void onMessageReceived(MessageEvent messageEvent) { 
    super.onMessageReceived(messageEvent); 

    try { 
     if (SEND_MESSAGE_PATH.equalsIgnoreCase(messageEvent.getPath())) { 
      if (!SbsNotificationHelper.isNotificationActive()) { 
       int notificationId = 001; 
       NotificationCompat.Builder notificationBuilder = SbsNotificationHelper.buildRoundInProgressNotification(sbsApplication); 

       NotificationManagerCompat notificationManagerCompat = NotificationManagerCompat.from(this); 
       notificationManagerCompat.notify(notificationId, notificationBuilder.build()); 
      } 
     } 
    } 
    catch (Throwable throwable) { 
     //Handle errors 
    } 
} 
+0

一个想法:'OnStop()'引用关闭屏幕的设备吗?据我所知,Android Wear的概念包括停止所有正在运行的应用程序,当设备处于睡眠状态时,保存消息摘要和时钟。 – Wolfish

0

我已经没有问题,做服装设备工作完全正常的一个“延伸服务”的应用程序。

基本上:在Wear应用程序中 - 分离您的GUI和应用程序逻辑。保持服务内部的应用程序逻辑。当Activity开始时,我保留一个拥有所有GUI数据的类对象,并将其从服务中取出。

您可以扩展可穿戴服务,但我只使用通用服务作为我的应用程序的中心,并且工作得很好(应用程序运行几天而没有问题)。

相关问题