2014-07-11 102 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數據的類對象,並將其從服務中取出。

您可以擴展可穿戴服務,但我只使用通用服務作爲我的應用程序的中心,並且工作得很好(應用程序運行幾天而沒有問題)。

相關問題