Android Wear生態系統似乎圍繞着用戶將與之交互的快速任務構建,然後關閉。這對大多數應用程序來說都很好用,但是對於覆蓋長時間運行任務的應用程序又該如何處理,並且在手錶睡覺時不應該自動關閉?Android Wear上的長時間運行應用程序
我的具體案例:Swing by Swing Golf GPS。首選操作是讓應用程序保持活動狀態,並在屏幕由於用戶操作而喚醒時顯示。一次性使用的壽命將在2至4小時之間。
有什麼方法可以使Android Wear設備上的應用程序前端和中心保持一段時間?
Android Wear生態系統似乎圍繞着用戶將與之交互的快速任務構建,然後關閉。這對大多數應用程序來說都很好用,但是對於覆蓋長時間運行任務的應用程序又該如何處理,並且在手錶睡覺時不應該自動關閉?Android Wear上的長時間運行應用程序
我的具體案例:Swing by Swing Golf GPS。首選操作是讓應用程序保持活動狀態,並在屏幕由於用戶操作而喚醒時顯示。一次性使用的壽命將在2至4小時之間。
有什麼方法可以使Android Wear設備上的應用程序前端和中心保持一段時間?
OnPause()
方法在設備進入休眠或對話框出現在應用程序上時調用。一個或兩個活動可以在這裏完成,但它們應該保持合理的輕量級以防止延長的用戶等待時間。
所以,這裏是我想出了一個解決方案:
建立一個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()
發出通知。這樣,如果您的應用中有多項活動,則可以展示它們(僅導致Activity
的onPause()
)。
@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
}
}
一個想法:'OnStop()'引用關閉屏幕的設備嗎?據我所知,Android Wear的概念包括停止所有正在運行的應用程序,當設備處於睡眠狀態時,保存消息摘要和時鐘。 – Wolfish
我已經沒有問題,做服裝設備工作完全正常的一個「延伸服務」的應用程序。
基本上:在Wear應用程序中 - 分離您的GUI和應用程序邏輯。保持服務內部的應用程序邏輯。當Activity開始時,我保留一個擁有所有GUI數據的類對象,並將其從服務中取出。
您可以擴展可穿戴服務,但我只使用通用服務作爲我的應用程序的中心,並且工作得很好(應用程序運行幾天而沒有問題)。
所以你說最佳做法是在手錶進入睡眠狀態時添加通知?並從該通知用戶將重新進入我們的應用程序? –
@TerrenceGiggy 不一定。這是一個選項,是的,但請記住,許多重量級的東西需要由關聯的設備來完成。您可以使用'OnPause()'方法向相關設備發送通知,然後使用'NotificationCompat.Builder'爲您的設備創建一個喚醒通知,它將再次在Wear設備上啓動應用程序。您需要一種方法將應用程序的數據發送回設備。 – Wolfish
@TerrenceGiggy 因此: 第1步:用戶啓動應用程序 第2步:應用程序查找完成的動作(高爾夫球手的揮杆)。 第3步:應用程序將數據發送到Android設備。 步驟4:磨損裝置進入睡眠狀態。 第5步:用戶查看揮杆。 請記住,2-4小時的清醒會殺死磨損電池的壽命,這就是爲什麼我建議這種方法。 – Wolfish