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