安卓7.0杀敌应用,即使前景服务正在运行(Android 7.0 Kills App Even Wh

2019-10-29 11:34发布

我曾尝试每一个建议,我可以在网上找到使用前台服务,以保持我的应用程序运行超出了睡眠和深度睡眠模式,但没有已经成功至今的。

我工作的一个出租车预订应用程序。 我设计的开始发射的驾驶位置服务器每当驾驶员打开自己的在线和停止时发出脱机。

以下是每当驾驶员打开自己的在线时启动,当他按下按钮,在线从而改变Common.CustomSocketOn 0停止前景服务代码。

它的屏幕唤醒期间正常工作,也当屏幕关闭的应用程序就会被杀死之前的作品。

然而,即使有WAKE_LOCK收购,但仍无法通过Android的7被杀前停留超过几分钟的睡眠模式。

因为当应用程序被打死默默地,它不会打开驱动器离线也不帮他签的机会,这未能保持在睡眠模式下运行打破了应用程序的许多其他功能。 其结果是,司机被预订请求时,他的应用程序没有运行,因此,也顾不上它,而保持从去到下一个可用的驱动器的预订。 事实上,这会导致许多其他异常。

请,有人可以告诉我,我需要做的,让Android的杀死了前台服务任何其他东西。

public class OnlineForeGroundService extends Service {

private static final String TAG_FOREGROUND_SERVICE = "FOREGROUND_SERVICE";
public static final String ACTION_START_FOREGROUND_SERVICE = "ACTION_START_FOREGROUND_SERVICE";
public static final String ACTION_STOP_FOREGROUND_SERVICE = "ACTION_STOP_FOREGROUND_SERVICE";

private static LocationListener locationListener;
private static LocationManager locationManager;

private PowerManager.WakeLock wakeLock;

public OnlineForeGroundService() {
}

@Override
public IBinder onBind(Intent intent) {
    // TODO: Return the communication channel to the service.
    //throw new UnsupportedOperationException("Not yet implemented");
    return null;
}

@Override
public void onCreate() {
    super.onCreate();
    Log.d(TAG_FOREGROUND_SERVICE, "My foreground service.");

    final PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
    try {
        wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "KEEP_AWAKE");
    }
    catch (Exception e){
        e.printStackTrace();
    }
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    if(intent != null)
    {
        String action = intent.getAction();

        if(action != null) {
            switch (action) {
                case ACTION_START_FOREGROUND_SERVICE:
                    startForegroundService();
                    Toast.makeText(getApplicationContext(), getText(R.string.going_online), Toast.LENGTH_SHORT).show();
                    wakeLock.acquire();
                    break;
                case ACTION_STOP_FOREGROUND_SERVICE:
                    stopForegroundService();
                    //Toast.makeText(getApplicationContext(), getText(R.string.going_offline), Toast.LENGTH_SHORT).show();
                    break;
            }
        }
    }
    return super.onStartCommand(intent, flags, startId);
    //return START_STICKY;
}

/* Used to build and start foreground service. */
@SuppressLint("MissingPermission")
private void startForegroundService()
{
    if(OnlineForeGroundService.locationManager == null) {
        OnlineForeGroundService.locationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);
    }


    if(OnlineForeGroundService.locationListener == null) {
        OnlineForeGroundService.locationListener = new LocationListener() {
            @Override
            public void onLocationChanged(Location location) {

                if (Common.CustomSocketOn == 1) {
                    SharedPreferences userPref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());

                    if (Common.OldLatitude != 0 && Common.OldLongitude != 0) {

                        float distance[] = new float[1];
                        Location.distanceBetween(Common.OldLatitude, Common.OldLongitude, location.getLatitude(), location.getLongitude(), distance);

                        //Distance - 100
                        if (distance.length > 0 && distance[0] > 30) {
                            try {
                                JSONArray locAry = new JSONArray();
                                locAry.put(location.getLatitude());
                                locAry.put(location.getLongitude());
                                JSONObject emitobj = new JSONObject();
                                emitobj.put("coords", locAry);
                                emitobj.put("driver_name", userPref.getString("user_name", ""));
                                emitobj.put("driver_id", userPref.getString("id", ""));
                                emitobj.put("driver_status", "1"); //change by sir
                                emitobj.put("car_type", userPref.getString("car_type", ""));
                                emitobj.put("isdevice", "1");
                                emitobj.put("booking_status", userPref.getString("booking_status", ""));
                                emitobj.put("isLocationChange", 1);
                                if (location.getLatitude() != 0.0 && location.getLongitude() != 0.0 && Common.socket != null && Common.socket.connected()) {
                                    Common.socket.emit("Create Driver Data", emitobj);
                                } else if (location.getLatitude() != 0.0 && location.getLongitude() != 0.0 && Common.socket == null) {
                                    Common.socket = null;
                                    SocketSingleObject.instance = null;
                                    Common.socket = SocketSingleObject.get(getApplicationContext()).getSocket();
                                    Common.socket.connect();
                                    Common.socket.emit("Create Driver Data", emitobj);
                                } else if (location.getLatitude() != 0.0 && location.getLongitude() != 0.0 && Common.socket != null && !Common.socket.connected()) {
                                    Common.socket.connect();
                                    Common.socket.emit("Create Driver Data", emitobj);
                                }
                            } catch (JSONException e) {
                                e.printStackTrace();
                            } catch (Exception e) {
                                e.printStackTrace();
                            }

                            Common.OldLatitude = location.getLatitude();
                            Common.OldLongitude = location.getLongitude();
                        }
                    }

                    if (Common.OldLatitude == 0 && Common.OldLongitude == 0) {
                        Common.OldLatitude = location.getLatitude();
                        Common.OldLongitude = location.getLongitude();
                    }

                }
                else{
                    stopForegroundService();
                }
            }

            @Override
            public void onProviderDisabled(String provider) {
                Log.d("Latitude", "disable");
            }

            @Override
            public void onProviderEnabled(String provider) {
                Log.d("Latitude", "enable");
            }

            @Override
            public void onStatusChanged(String provider, int status, Bundle extras) {
            }
        };
    }


    if(Common.isPermission){
        if(Common.CustomSocketOn == 1){
            try {
                OnlineForeGroundService.locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, Common.DriverDistanceTime, Common.DriverDistance, OnlineForeGroundService.locationListener);
                OnlineForeGroundService.locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, Common.DriverDistanceTime, Common.DriverDistance, OnlineForeGroundService.locationListener);
            }
            catch (Exception e){
                e.printStackTrace();
            }
        }
    }



    Log.d(TAG_FOREGROUND_SERVICE, "Starting foreground service.");
    String onlineSticker = getText(R.string.app_name)+" - Online";

    Intent notificationIntent = new Intent(this, HomeActivity.class);
    notificationIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
    PendingIntent pendingIntent =
            PendingIntent.getActivity(this, 0, notificationIntent, 0);

    Notification notification;
    /*if(android.os.Build.VERSION.SDK_INT >= 26) {
        notification = new Notification.Builder(HomeActivity.class, NotificationManager.IMPORTANCE_HIGH)
                .setContentTitle(getText(R.string.app_name))
                .setContentText(getText(R.string.you_are_online))
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentIntent(pendingIntent)
                .setTicker(onlineSticker)
                .build();

        //startForeground(ONGOING_NOTIFICATION_ID, notification);

        // Start foreground service.
    }
    else{*/
        notification = new Notification.Builder(this)
                .setContentTitle(getText(R.string.app_name))
                .setContentText(getText(R.string.you_are_online))
                .setPriority(Notification.PRIORITY_HIGH)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentIntent(pendingIntent)
                .setTicker(onlineSticker)
                .build();
    //}
    startForeground(397, notification);
}

private void stopForegroundService()
{
    Toast.makeText(getApplicationContext(), getText(R.string.going_offline), Toast.LENGTH_SHORT).show();

    if(Common.isPermission){
        if(Common.CustomSocketOn == 0){
            try {
                OnlineForeGroundService.locationManager.removeUpdates(OnlineForeGroundService.locationListener);
                //OnlineForeGroundService.locationListener = null;
            }
            catch (Exception e){
                e.printStackTrace();
            }
        }
    }


    Log.d(TAG_FOREGROUND_SERVICE, "Stop foreground service.");

    if (null != wakeLock && wakeLock.isHeld()) {
        wakeLock.release();
    }

    // Stop foreground service and remove the notification.
    stopForeground(true);

    // Stop the foreground service.
    stopSelf();
}

}

下面是服务和WAKE_LOCK权限androidManifest条目:

<uses-permission android:name="android.permission.WAKE_LOCK" />
<service
        android:name=".driver.service.OnlineForeGroundService"
        android:process=".process"
        android:enabled="true"
        android:exported="true" ></service>

Answer 1:

检查你是如何开始你的OnlineForeGroundService

在Android奥利奥以上需要与启动startForegroundService(Intent intent) ,不startService(Intent intent)

例如是这样的:

final Intent serviceIntent = new Intent(context, OnlineForeGroundService.class);
serviceIntent.setAction(OnlineForeGroundService.ACTION_START_FOREGROUND_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    startForegroundService(serviceIntent);
} else {
    startService(serviceIntent);
}


Answer 2:

请参阅本优秀的网站提供的涵盖了各个不同的手机厂商和Android API版本的大量信息。

这有助于我了解大量处理的报告和前台服务反馈的很常见的Android开发者的问题被杀害,尽管下面的记录的步骤,以确保您的服务是否设置正确,以避免被关闭。

https://dontkillmyapp.com/stock_android

该网站包括的戴安娜Hackborn评论这是现在不再可访问的谷歌,加上(由于它的生命结束)提及。

最终似乎解决方案,以防止你的前景服务被关闭可能会在Android OS版本和设备制造商而异,但本网站提供的用户可以直接跟随,也开发人员可以实现(如果可能)的步骤一个很好的总结试图缓解这个问题。



文章来源: Android 7.0 Kills App Even When Foreground Service is Running