当应用程序从堆栈中被杀死时,后台服务停止

Posted

技术标签:

【中文标题】当应用程序从堆栈中被杀死时,后台服务停止【英文标题】:Background service is stoped when application is killed from stack 【发布时间】:2019-10-01 09:53:07 【问题描述】:

当应用程序从堆栈中终止时,后台服务将停止

public int onStartCommand(Intent intent, int flags, int startId) 

    googleApiClient = new GoogleApiClient.Builder(getApplicationContext())
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this)
                    .addApi(LocationServices.API)
                    .build();

    return START_STICKY;
    

【问题讨论】:

【参考方案1】:

没有直接的解决方案,但下面的链接中提到了解决方法,

https://***.com/a/58162451/7579041

以上链接适用于库存 ROM 和自定义 ROM 设备,如 OnePlus、OPPO、VIVO 等

希望对你有帮助

【讨论】:

【参考方案2】:

转到应用信息并为您的应用授予自动启动权限。 如果您想以编程方式获取此权限。

    public class Utils 

public static void startPowerSaverIntent(Context context) 
    SharedPreferences settings = context.getSharedPreferences("ProtectedApps", Context.MODE_PRIVATE);
    boolean skipMessage = settings.getBoolean("skipProtectedAppCheck", false);
    if (!skipMessage) 
        final SharedPreferences.Editor editor = settings.edit();
        boolean foundCorrectIntent = false;
        for (Intent intent : Constants.POWERMANAGER_INTENTS) 
            if (isCallable(context, intent)) 
                foundCorrectIntent = true;
                final AppCompatCheckBox dontShowAgain = new AppCompatCheckBox(context);
                dontShowAgain.setText("Do not show again");
                dontShowAgain.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() 
                    @Override
                    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) 
                        editor.putBoolean("skipProtectedAppCheck", isChecked);
                        editor.apply();
                    
                );

                new AlertDialog.Builder(context)
                        .setTitle(Build.MANUFACTURER + " Protected Apps")
                        .setMessage(String.format("%s requires to be enabled in 'Protected Apps' to function properly.%n", context.getString(R.string.app_name)))
                        .setView(dontShowAgain)
                        .setPositiveButton("Go to settings", new DialogInterface.OnClickListener() 
                            public void onClick(DialogInterface dialog, int which) 
                                context.startActivity(intent);
                            
                        )
                        .setNegativeButton(android.R.string.cancel, null)
                        .show();
                break;
            
        
        if (!foundCorrectIntent) 
            editor.putBoolean("skipProtectedAppCheck", true);
            editor.apply();
        
    


private static boolean isCallable(Context context, Intent intent) 
    try 
        if (intent == null || context == null) 
            return false;
         else 
            List<ResolveInfo> list = context.getPackageManager().queryIntentActivities(intent,
                    PackageManager.MATCH_DEFAULT_ONLY);
            return list.size() > 0;
        
     catch (Exception ignored) 
        return false;
    



为不同的设备添加这个

public class Constants 
//updated the POWERMANAGER_INTENTS 26/06/2019
static final List<Intent> POWERMANAGER_INTENTS = Arrays.asList(
        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.huawei.systemmanager", "com.huawei.systemmanager.optimize.process.ProtectActivity")),
        new Intent().setComponent(new ComponentName("com.huawei.systemmanager", Build.VERSION.SDK_INT >= Build.VERSION_CODES.P? "com.huawei.systemmanager.startupmgr.ui.StartupNormalAppListActivity": "com.huawei.systemmanager.appcontrol.activity.StartupAppControlActivity")),
        new Intent().setComponent(new ComponentName("com.coloros.oppoguardelf", "com.coloros.powermanager.fuelgaue.PowerUsageModelActivity")),
        new Intent().setComponent(new ComponentName("com.coloros.oppoguardelf", "com.coloros.powermanager.fuelgaue.PowerSaverModeActivity")),
        new Intent().setComponent(new ComponentName("com.coloros.oppoguardelf", "com.coloros.powermanager.fuelgaue.PowerConsumptionActivity")),
        new Intent().setComponent(new ComponentName("com.coloros.safecenter", "com.coloros.safecenter.permission.startup.StartupAppListActivity")),
        Build.VERSION.SDK_INT >= Build.VERSION_CODES.N ? new Intent().setComponent(new ComponentName("com.coloros.safecenter", "com.coloros.safecenter.startupapp.StartupAppListActivity")).setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS).setData(Uri.parse("package:"+ MyApplication.getContext().getPackageName())) : null,
        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")),
        new Intent().setComponent(new ComponentName("com.asus.mobilemanager", "com.asus.mobilemanager.autostart.AutoStartActivity")),
        new Intent().setComponent(new ComponentName("com.letv.android.letvsafe", "com.letv.android.letvsafe.AutobootManageActivity"))
                .setData(android.net.Uri.parse("mobilemanager://function/entry/AutoStart")),
        new Intent().setComponent(new ComponentName("com.meizu.safe", "com.meizu.safe.security.SHOW_APPSEC")).addCategory(Intent.CATEGORY_DEFAULT).putExtra("packageName", BuildConfig.APPLICATION_ID)
);

权限

<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
<uses-permission android:name="oppo.permission.OPPO_COMPONENT_SAFE"/>
<uses-permission android:name="com.huawei.permission.external_app_settings.USE_COMPONENT"/>

【讨论】:

以上是关于当应用程序从堆栈中被杀死时,后台服务停止的主要内容,如果未能解决你的问题,请参考以下文章

后台服务在android中被杀死

当应用程序在后台或在本机反应中被杀死时,是不是可以检查用户的移动活动?

应用程序被杀后,广播接收器未调用服务

即使应用程序在 ios 中被杀死或从后台删除,如何继续更新我的位置?

每当 App 在 android pie 中被杀死时,服务也会被杀死

django开发服务器,如何在后台运行时停止它