Phone 锁定时保持 App 运行 的问题
Problem keeping App Running when Phone locks
所以我遇到了一个恼人的问题。我目前正在开发一个用于跟踪用户睡眠的应用程序。我们有一项服务,可以 运行 发送声纳并收听回波。为此,服务需要整夜 运行,并且由于其他一些问题,我们需要锁定屏幕。该服务由一个对象启动,我们将接口传递给该对象以处理与处理相关的回调。当前调用 activity 正在实现此接口以正确响应回调。
现在我遇到的问题有时是在监视会话期间,服务被终止或应用程序被终止。为了消除被系统杀死的可能性,我正在寻找策略来尝试向系统识别该应用程序正在 运行ning 并且需要 运行 整晚,即使屏幕被锁定也是如此。
首先我尝试了一个唤醒锁:PowerManager.PARTIAL_WAKE_LOCK
我最近为会话添加了一个托盘通知运行尝试让它保持活动状态,但效果不是很好
public class Notification extends ContextWrapper {
Context context;
public Notification(Context base) {
super(base);
this.context = base;
createChannels();
}
private NotificationManager mManager;
public void createChannels() {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
NotificationChannel sessionChannel = new NotificationChannel(Constants.Notification.TRACKING_CHANNEL,
Constants.Notification.ANDROID_CHANNEL_NAME, NotificationManager.IMPORTANCE_LOW);
sessionChannel.enableLights(false);
sessionChannel.enableVibration(false);
getManager().createNotificationChannel(sessionChannel);
NotificationChannel bedtimeChannel = new NotificationChannel(Constants.Notification.BEDTIME_CHANNEL,
Constants.Notification.ANDROID_CHANNEL_NAME, NotificationManager.IMPORTANCE_HIGH);
getManager().createNotificationChannel(bedtimeChannel);
}
}
public NotificationManager getManager() {
if (mManager == null) {
mManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
}
return mManager;
}
public NotificationCompat.Builder getTrackingChannelNotification(String title, String body) {
Intent trackingIntent = new Intent(context, SessionRecordingActivity.class);
trackingIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, trackingIntent, 0);
return new NotificationCompat.Builder(getApplicationContext(), Constants.Notification.TRACKING_CHANNEL)
.setContentTitle(title)
.setContentText(body)
.setContentIntent(pendingIntent)
.setOngoing(true)
.setSmallIcon(R.mipmap.ic_launcher_new);
}
public NotificationCompat.Builder getBedTimeChannelNotification(String title, String body, Intent actionIntent) {
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, actionIntent, 0);
Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
return new NotificationCompat.Builder(getApplicationContext(), Constants.Notification.TRACKING_CHANNEL)
.setSmallIcon(R.mipmap.ic_launcher_new)
.setContentTitle(title)
.setContentText(body)
.setStyle(new NotificationCompat.BigTextStyle().bigText(body))
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setContentIntent(pendingIntent)
.setSound(defaultSoundUri)
.setAutoCancel(true);
}
}
这是我在服务启动后所做的事情:
NotificationCompat.Builder nb = mNotification.getTrackingChannelNotification(getString(R.string.tracking_in_progress), getString(R.string.sleep_well));
mNotification.getManager().notify(Constants.Notification.TRACKING_ID, nb.build());
然后我在会话结束时执行此操作:
mNotification.getManager().cancel(Constants.Notification.TRACKING_ID);
所以对于我的问题:我还能做些什么来向系统识别我的应用程序需要保持 运行ning 直到用户结束它? (作为一个快速的旁注,该服务不是由我的应用程序直接启动的,它是启动该服务的第三方库)。
编辑:经过进一步调查,现在看来可能是我的 activity/application 被杀死,而不是服务。除了唤醒锁定或托盘通知之外,还有其他方法可以在屏幕锁定时让我的应用程序保持活动状态吗?
您必须在 Oncreate()
中调用 startForeground
以获得您使用的服务 Context.startForegroundService()
。
@Override
public void onCreate() {
super.onCreate();
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
String CHANNEL_ID = "my_channel_01";
NotificationChannel channel = new NotificationChannel(CHANNEL_ID,
"Channel human readable title",
NotificationManager.IMPORTANCE_DEFAULT);
((NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE)).createNotificationChannel(channel);
Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("")
.setContentText("").build();
startForeground(1, notification);
}
}
你可以从这里了解更多link
所以我遇到了一个恼人的问题。我目前正在开发一个用于跟踪用户睡眠的应用程序。我们有一项服务,可以 运行 发送声纳并收听回波。为此,服务需要整夜 运行,并且由于其他一些问题,我们需要锁定屏幕。该服务由一个对象启动,我们将接口传递给该对象以处理与处理相关的回调。当前调用 activity 正在实现此接口以正确响应回调。
现在我遇到的问题有时是在监视会话期间,服务被终止或应用程序被终止。为了消除被系统杀死的可能性,我正在寻找策略来尝试向系统识别该应用程序正在 运行ning 并且需要 运行 整晚,即使屏幕被锁定也是如此。
首先我尝试了一个唤醒锁:PowerManager.PARTIAL_WAKE_LOCK
我最近为会话添加了一个托盘通知运行尝试让它保持活动状态,但效果不是很好
public class Notification extends ContextWrapper {
Context context;
public Notification(Context base) {
super(base);
this.context = base;
createChannels();
}
private NotificationManager mManager;
public void createChannels() {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
NotificationChannel sessionChannel = new NotificationChannel(Constants.Notification.TRACKING_CHANNEL,
Constants.Notification.ANDROID_CHANNEL_NAME, NotificationManager.IMPORTANCE_LOW);
sessionChannel.enableLights(false);
sessionChannel.enableVibration(false);
getManager().createNotificationChannel(sessionChannel);
NotificationChannel bedtimeChannel = new NotificationChannel(Constants.Notification.BEDTIME_CHANNEL,
Constants.Notification.ANDROID_CHANNEL_NAME, NotificationManager.IMPORTANCE_HIGH);
getManager().createNotificationChannel(bedtimeChannel);
}
}
public NotificationManager getManager() {
if (mManager == null) {
mManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
}
return mManager;
}
public NotificationCompat.Builder getTrackingChannelNotification(String title, String body) {
Intent trackingIntent = new Intent(context, SessionRecordingActivity.class);
trackingIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, trackingIntent, 0);
return new NotificationCompat.Builder(getApplicationContext(), Constants.Notification.TRACKING_CHANNEL)
.setContentTitle(title)
.setContentText(body)
.setContentIntent(pendingIntent)
.setOngoing(true)
.setSmallIcon(R.mipmap.ic_launcher_new);
}
public NotificationCompat.Builder getBedTimeChannelNotification(String title, String body, Intent actionIntent) {
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, actionIntent, 0);
Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
return new NotificationCompat.Builder(getApplicationContext(), Constants.Notification.TRACKING_CHANNEL)
.setSmallIcon(R.mipmap.ic_launcher_new)
.setContentTitle(title)
.setContentText(body)
.setStyle(new NotificationCompat.BigTextStyle().bigText(body))
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setContentIntent(pendingIntent)
.setSound(defaultSoundUri)
.setAutoCancel(true);
}
}
这是我在服务启动后所做的事情:
NotificationCompat.Builder nb = mNotification.getTrackingChannelNotification(getString(R.string.tracking_in_progress), getString(R.string.sleep_well));
mNotification.getManager().notify(Constants.Notification.TRACKING_ID, nb.build());
然后我在会话结束时执行此操作:
mNotification.getManager().cancel(Constants.Notification.TRACKING_ID);
所以对于我的问题:我还能做些什么来向系统识别我的应用程序需要保持 运行ning 直到用户结束它? (作为一个快速的旁注,该服务不是由我的应用程序直接启动的,它是启动该服务的第三方库)。
编辑:经过进一步调查,现在看来可能是我的 activity/application 被杀死,而不是服务。除了唤醒锁定或托盘通知之外,还有其他方法可以在屏幕锁定时让我的应用程序保持活动状态吗?
您必须在 Oncreate()
中调用 startForeground
以获得您使用的服务 Context.startForegroundService()
。
@Override
public void onCreate() {
super.onCreate();
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
String CHANNEL_ID = "my_channel_01";
NotificationChannel channel = new NotificationChannel(CHANNEL_ID,
"Channel human readable title",
NotificationManager.IMPORTANCE_DEFAULT);
((NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE)).createNotificationChannel(channel);
Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("")
.setContentText("").build();
startForeground(1, notification);
}
}
你可以从这里了解更多link