2016-10-14 1 views
0

сервис прекратит работать, когда мы очистим приложение из последних приложений? потому что когда iam работает под кодом. Чтобы обновить lat, lng, когда изменилось местоположение. Когда я очищаю приложение от последних приложений, обновление местоположения становится остановленным. Когда я вижу, что мои запущенные приложения видят, что служба находилась в состоянии running.please, очистите сомнение в том, как служба будет работать точно. Advance.Служба перестанет работать, когда мы очистим приложение из последних приложений?

public class GPSTracker extends Service implements 
    ConnectionCallbacks, 
    OnConnectionFailedListener, 
    LocationListener, GooglePlayServicesClient.ConnectionCallbacks { 

public static final long UPDATE_INTERVAL = 5000; 
public static final long FASTEST_INTERVAL = 1000; 

private LocationClient mLocationClient; 
private LocationRequest mLocationRequest; 
private boolean mInProgress; 
private boolean servicesAvailable = false; 
DatabaseHandler db; 
@Override 
public void onCreate() { 
    super.onCreate(); 

    mInProgress = false; 
    mLocationRequest = LocationRequest.create() 
      .setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY) 

     .setInterval(UPDATE_INTERVAL) // Set the update interval to 5 seconds 
     .setFastestInterval(FASTEST_INTERVAL); // Set the fastest update interval to 1 second 

    servicesAvailable = servicesConnected(); 
    setUpLocationClientIfNeeded(); 
    db = new DatabaseHandler(this); 
} 

private boolean servicesConnected() { 
    int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this); 
    return ConnectionResult.SUCCESS == resultCode; 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    super.onStartCommand(intent, flags, startId); 
    Log.d("TAG", "onLocationChanged onStart Command"); 
    if (!servicesAvailable || mLocationClient.isConnected() || mInProgress) 
     return START_STICKY; 

    setUpLocationClientIfNeeded(); 

    if (!mLocationClient.isConnected() || !mLocationClient.isConnecting() && !mInProgress) { 
     mInProgress = true; 
     mLocationClient.connect(); 
    } 

    return START_STICKY; 
} 

@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

    @Override 
    public void onDestroy() { 
/* mInProgress = false; 
    if (servicesAvailable && mLocationClient != null) { 
     mLocationClient.removeLocationUpdates(this); 
     mLocationClient = null; 
    } 
    */ 
    super.onDestroy(); 
} 

private void setUpLocationClientIfNeeded() { 
    if (mLocationClient == null) 
     mLocationClient = new LocationClient(this, this, this); 
} 

/* 
* LocationListener Callbacks 
*/ 

@Override 
public void onLocationChanged(Location location) { 
    //Carnival.updateLocation(location); 
    Log.d("TAG", "onLocationChanged " + location.getLongitude()); 
    Log.d("Insert: ", "Inserting .."); 
    db.addContact(new Contact("" + location.getTime(), " Latitude " + location.getLatitude() + " Longitude " + location.getLongitude())); 

} 



/* 
* GooglePlayServicesClient Callbacks 
*/ 

@Override 
public void onConnected(Bundle bundle) { 
    if (mLocationClient != null) { 
     mLocationClient.requestLocationUpdates(mLocationRequest, this); 
    } 
} 

@Override 
public void onDisconnected() { 

} 

@Override 
public void onConnectionSuspended(int i) { 

} 



@Override 
public void onConnectionFailed(ConnectionResult connectionResult) { 
    mInProgress = false; 
    /* 
    * Google Play services can resolve some errors it detects. 
    * If the error has a resolution, try sending an Intent to 
    * start a Google Play services activity that can resolve 
    * error. 
    */ 
    if (!connectionResult.hasResolution()) { 
     // If no resolution is available, display an error dialog 
    } 
} 
} 
+0

у вас есть 'return START_STICKY', так что даже если его убитая система перезапустит то же самое – Raghunandan

+0

i, вернусь START_STICKY, проверьте код выше –

ответ

0

Вам необходимо установить stopWithTask=false в манифест для обслуживания.

Что-то вроде этого:

<service 
    android:enabled="true" 
    android:name=".MyService" 
    android:stopWithTask="false" /> 

Это предотвращает обслуживание от остановки и есть метод onTaskRemoved() который вызывается, если мы освободим приложение из списка недавних, если вы хотите, чтобы выполнить какие-либо действия вы можете ovorride it.it.

0

есть событие с именем OnStartCommand() заменить его и снова вызвать активность в этой функции

1

Регулярное Service не будет достаточно, чтобы убедиться, что система не собирается убить его, пока он/она очищает наше приложение из списка Recent.

Для этой конкретной цели, сказать систему, что вы хотите, чтобы Service быть запущен как foreground:

приоритетным это служба, которая считается чем-то пользователь активно осознает и, таким образом, не является кандидатом для системы убить ...

Вы что, называя это изнутри Service:

Notification notification = new Notification(R.drawable.icon, getText(R.string.ticker_text), System.currentTimeMillis()); 
    Intent notificationIntent = new Intent(this, ExampleActivity.class); 
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); 

    notification.setLatestEventInfo(this, getText(R.string.notification_title), 
     getText(R.string.notification_message), pendingIntent); 

    startForeground(ONGOING_NOTIFICATION_ID, notification); 

Как вы можете видеть, startForeground() принимает в качестве одного из своих параметров Notification. В конце концов он поместит persistent notification, чтобы сообщить пользователям, что ваш Service в настоящее время работает в фоновом режиме.


После этого несколько больше исследований на этом, похоже, делает Service переднего плана не вполне достаточно, чтобы обеспечить его сохранение на условиях, как это.

Один из способов затем слушать, когда наше приложение в настоящее время скрыло из списка Недавнего и явно перезапустить наш Service оттуда, делая так:

@Override 
    public void onTaskRemoved(Intent rootIntent){ 
     Intent restartServiceIntent = new Intent(getApplicationContext(), this.getClass()); 

     PendingIntent restartServicePendingIntent = PendingIntent.getService(
     getApplicationContext(), 1, restartServiceIntent, PendingIntent.FLAG_ONE_SHOT); 
     AlarmManager alarmService = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
     alarmService.set(ELAPSED_REALTIME, elapsedRealtime() + 1000, restartServicePendingIntent); 

     super.onTaskRemoved(rootIntent); 
    } 

Конечно, вы должны добавить соответствующий флаг на Service на манифесте (см. Max Rockwood's answer).

Смежные вопросы