这是我第一次在这个论坛上提问:p 我做了一个必须在后台工作的android应用程序,即当手机处于待机状态时能够恢复用户的位置。我使用服务和唤醒锁。 该应用程序适用于 SAMSUNG ,但我注意到 HUAWEI 会杀死应用程序,如果它不在受保护的应用程序列表中。 所以我创建了一个对话框,告诉用户在受保护的应用程序列表中激活应用程序,如下所示:Keeping a periodic service active while the phone is locked 由于我的应用程序应该在所有Android手机上运行我想知道是否有其他手机品牌在手机闲置时杀死应用程序请做同样的事情。 提前谢谢你:)
答案 0 :(得分:1)
Service
在前台运行。
在Android O上,您可以通过startForegroundService(Intent)
获得新的工作方式这将在通知托盘中发出通知,告知Android操作系统您的进程当前正在运行。然后一定要在任务完成后停止服务。
有关Services
的更多信息,请查看the Service documentation。这将向您展示如何使用正确的文本添加通知。
通过查看Background Process documentation来了解后台进程在Android O中的工作方式也可能会有所帮助。如果您正确地遵循(并从前台开始),您的流程应尽可能具有所有制造商的弹性。
答案 1 :(得分:0)
我正在处理的应用程序需要在后台运行,并为此使用前台服务。从Android 8+开始(可能不仅限于这些版本),许多华为用户报告屏幕被锁定后7 7分钟(没有看到here,该应用已关闭(无任何通知)。和here)。
实际上,华为设备会通过默认值终止正在运行的应用程序,以优化电池消耗(很酷吗?)。 AFAIK没有办法以编程方式解决此问题。许多开发人员建议用户如何将应用列入白名单(例如:Endomondo)。 我还在寻找一种以编程方式检测优化的方法,以便至少警告用户。 Here,您可以找到可能的解决方案,但我还没有时间尝试一下。
答案 2 :(得分:0)
我遇到了同样的问题,使用可访问性时,我试图让类名称或活动名称传递意图并打开设置,看起来旧的受保护的应用列表不再可用,新方法是:
在华为启动中禁用该应用程序
在Oreo Huawei p10上测试:
对于“手动”,您可以执行以下步骤:
设置->电池->启动
找到您的应用程序并禁用
以编程方式:
public class Constant {
public static List<Intent> POWERMANAGER_INTENTS = Arrays.asList(
new Intent().setComponent(new ComponentName("com.huawei.systemmanager", "com.huawei.systemmanager.appcontrol.activity.StartupAppControlActivity")),
new Intent().setComponent(new ComponentName("com.miui.securitycenter", "com.miui.permcenter.autostart.AutoStartManagementActivity")),
new Intent().setComponent(new ComponentName("com.letv.android.letvsafe", "com.letv.android.letvsafe.AutobootManageActivity")),
new Intent().setComponent(new ComponentName("com.coloros.safecenter", "com.coloros.safecenter.permission.startup.StartupAppListActivity")),
new Intent().setComponent(new ComponentName("com.coloros.safecenter", "com.coloros.safecenter.startupapp.StartupAppListActivity")),
new Intent().setComponent(new ComponentName("com.oppo.safe", "com.oppo.safe.permission.startup.StartupAppListActivity")),
new Intent().setComponent(new ComponentName("com.iqoo.secure", "com.iqoo.secure.ui.phoneoptimize.AddWhiteListActivity")),
new Intent().setComponent(new ComponentName("com.iqoo.secure", "com.iqoo.secure.ui.phoneoptimize.BgStartUpManager")),
new Intent().setComponent(new ComponentName("com.vivo.permissionmanager", "com.vivo.permissionmanager.activity.BgStartUpManagerActivity")),
new Intent().setComponent(new ComponentName("com.asus.mobilemanager", "com.asus.mobilemanager.entry.FunctionActivity")).setData(android.net.Uri.parse("mobilemanager://function/entry/AutoStart"))
);
}
在实用程序或活动类中放置以下代码
private static boolean isCallable(Context context, Intent intent) {
List<ResolveInfo>list=context.getPackageManager().queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY);
return list.size() > 0;
}
saveUserSessionManager是首选项,您可以设置首选项类而不是SaveUserSessionManager
public static void startPowerSaverIntent(Context context, SaveUserSessionManager saveUserSessionManager) {
boolean skipMessage = saveUserSessionManager.getDataByKey("skipProtectedAppCheck", false);
if (!skipMessage) {
boolean foundCorrectIntent = false;
for (Intent intent : Constant.POWERMANAGER_INTENTS) {
if (isCallable(context, intent)) {
foundCorrectIntent = true;
new AlertDialog.Builder(context)
.setTitle(Build.MANUFACTURER + " Protected Apps")
.setMessage(String.format("%s requires to be 'White list' to function properly.\nDisable %s from list.%n", context.getString(R.string.app_name), context.getString(R.string.app_name)))
.setPositiveButton("Go to settings", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
context.startActivity(intent);
saveUserSessionManager.storeDataByKey("skipProtectedAppCheck", true);
dialog.dismiss();
}
})
.show();
break;
}
}
}
}
如何致电? 在您的MainActivity中的onResume方法中,检查其启用情况。
@Override
protected void onResume() {
super.onResume();
//saveUserSessionManager is just a Preference you can set your preference class instead of SessionManager
if (!saveUserSessionManager.getDataByKey("skipProtectedAppCheck", false)) {
Utils.startPowerSaverIntent(mContext, saveUserSessionManager);
}
}
仅此而已:)