我的应用程序中有一个服务,它设计为每10分钟运行一次.它基本上检查我们的服务器,看看是否一切正常运行,并通知用户任何问题.我创建了这个应用程序供我们公司内部使用.
我的同事在漫长的周末使用了该应用程序,并注意到该设备进入睡眠状态时未执行任何检查.我的印象是服务应该在后台继续运行,直到我明确地调用stopService()我的代码.
所以最终,我的目标是让服务运行,直到用户点击应用程序中的关闭按钮或终止进程.
我听说过一些叫做WakeLock屏幕不能关闭的东西,这不是我想要的.然后我听说了另一种称为部分WakeLock的东西,即使设备处于睡眠状态,也可以使CPU保持运行.后者听起来更接近我的需要.
我如何获得此WakeLock以及何时应该发布它并且有其他方法可以解决这个问题吗?
此代码将在启动系统后自动运行应用程序,但按下后退按钮后应用程序将关闭.
如果应用程序通过单击它的图标正常运行.即使按下后退按钮或运行其他应用程序,它也会继续运行.
public class AutoBoot extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent i = new Intent(context, MyActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,即使在按下后退按钮或运行其他应用程序后,如何使此自动运行代码继续运行?
我正在对Android手机进行电池消费研究.我想每10分钟进行一次电池检查,直到电池完全耗尽.我一直有问题让它工作.
在我第一次尝试时,我在服务类中使用计时器,并每10分钟安排一次电池检查.但很快我发现屏幕熄灭时服务暂停了.
然后我尝试使用AlarmService,我每10分钟使用一次报警电话来唤醒我的服务并检查电池电量并将数据保存到SD卡上的文件中.它适用于屏幕关闭.但是,我只获得了9个小时的数据......似乎AlarmService在几个小时之后停止了.我不知道为什么会这样,系统是否因内存问题而将其杀死?
所以我的问题是,有没有人写过一些服务在后台运行(如永远)?你是怎么做到的,我非常感谢你的示例代码?
我目前正在阅读一些帖子,说我可以使用部分唤醒锁来保持服务活着......这是正确的方法吗?
非常感谢,我希望我能在这里得到一些有用的答案.
我已经阅读了关于这个主题的每个Stackoverflow答案,但它们都没有奏效.
问题:每当我的设备处于睡眠模式一小时或更长时间时,服务就会被终止
返回START_STICKY从onStartCommand()使用startForeground()
public int onStartCommand(Intent intent, int flags, int startId) {
notification = makeStickyNotification(); //I've simplified the irrelevant code, obviously this would be a real notification I build
startForeground(1234, notification);
return START_STICKY;
}
Run Code Online (Sandbox Code Playgroud)这样工作正常,它甚至可以在设备内存不足时重新启动我的服务,但这还不足以解决我的设备暂停一段时间后出现的问题.
在onCreate()我的Activity和onStartCommand()我的服务中使用Alarm Manager 来调用调用我的服务的广播接收器
Intent ll24 = new Intent(this, AlarmReceiver.class);
PendingIntent recurringLl24 = PendingIntent.getBroadcast(this, 0, ll24, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager alarms = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarms.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000*60, recurringLl24); // Every minute
Run Code Online (Sandbox Code Playgroud)这有助于保持我的服务活跃,但同样,不能解决我的问题
使用Schedule Task Executor使其保持活动状态
if (scheduleTaskExecutor …Run Code Online (Sandbox Code Playgroud)我正在尝试将 FCM 消息发送到我的设备。当应用程序位于后台或前台时,我可以正确接收它们。但是,当我的应用程序被终止时,即从最近的应用程序中删除时,如果它处于默认的“优化”电池使用模式,我不会收到通知。当我将应用程序的电池模式设置为“未优化”时,即使应用程序被终止,我也会正确收到通知。
是的,我尝试过以“高”优先级发送 FCM 消息和 FCM 通知,但接收消息时的 logcat 显示以下内容:
Error broadcast intent callback: result=CANCELLED forIntent { act=com.google.android.c2dm.intent.RECEIVE pkg=com.flagg327.guicomaipu (has extras) }
Run Code Online (Sandbox Code Playgroud)
我设备上的所有其他应用程序(WhatsApp、Facebook 等)都处于“优化”模式,但即使它们被杀死,它们也会收到推送通知。
我已经尝试安装我的应用程序的签名 apk 版本,但后台仍然没有响应
现在我已经实现了基本功能
@Override
protected void onStart() {
super.onStart();
packageName = getApplication().getPackageName();
intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
pm = (PowerManager)
getApplication().getSystemService(Context.POWER_SERVICE);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O &&
!pm.isIgnoringBatteryOptimizations(packageName)) {
intent.setAction(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);
getApplication().startActivity(intent);
}
}
Run Code Online (Sandbox Code Playgroud)
这基本上将用户带到设置并强制他禁用优化,但这是一个糟糕的方法,我们如何以编程方式解决这个问题。
我使用的是 OnePlus 5T(Android 8.1.0)。谁能解释一下为什么会在我的应用程序中发生这种情况?以及如何将我的应用程序添加到白名单
这可以实现吗这是我的数据有效负载代码
JSONObject root = new JSONObject();
JSONObject data = new JSONObject();
data.put("type", type);
data.put("message", message);
data.put("id", pNumber);
data.put("count",count);
JSONObject …Run Code Online (Sandbox Code Playgroud) android background push-notification firebase-cloud-messaging android-8.0-oreo