-1

I have a BOOT_COMPLETED Receiver. This receiver starting the service when the phone booted.But when receiver worked and started the service , working just onDestroy module on Service. I don't know why. I create a JobScheduler and checking service availability and re-run the service , the OS destroy every time.

The Boot receiver is ;

public class BootReciever extends BroadcastReceiver {
    private static final String TAG="Deneme-App";

    @Override public void onReceive(Context context, Intent intent){
        try{


            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                context.startForegroundService(new Intent(context,DenemeService.class));
            }else{
                context.startService(new Intent(context,DenemeService.class));
            }

            GcmNetworkManager   mGcmNetworkManager = GcmNetworkManager.getInstance(context);
            Task periodicTask = new PeriodicTask.Builder()
                    .setService(BestTimeService.class)
                    .setPeriod(1)
                    .setFlex(1)
                    .setTag("checkService")
                    .setPersisted(true)
                    .build();


            int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(context);
            if (resultCode == ConnectionResult.SUCCESS) {
                mGcmNetworkManager.schedule(periodicTask);
            } else {

                Log.e("Deneme-App", "Hello - Tag");
            }
            Log.e("Deneme-App", "Hello - Tag - OK");
            Log.e("Deneme-App","Starting Service ConnectivityListener");
        }catch(Exception e){
            Log.e("Deneme-App",e.toString());
        }
    } }

JOB Scheduler Code block ;

public class BestTimeService extends GcmTaskService {

    private static final String TAG = "Deneme-App";

    private boolean isMyServiceRunning(Class<?> serviceClass) {
        ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
            if (serviceClass.getName().equals(service.service.getClassName())) {
                return true;
            }
        }
        return false;
    }
    @Override
    public int onRunTask(TaskParams taskParams) {

        Context context=getApplicationContext();

        if(!isMyServiceRunning(DenemeService.class))
        {

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                context.startForegroundService(new Intent(context,DenemeService.class));
            }else{
                context.startService(new Intent(context,DenemeService.class));
            }
        }

        Log.i(TAG, "onRunTask");
        switch (taskParams.getTag()) {
            case "checkService":
                Log.i(TAG, "checkService");

                // This is where you need to perform the background tasks.

                return GcmNetworkManager.RESULT_SUCCESS;
            default:
                Log.i(TAG, "FAILURE checkService");
                return GcmNetworkManager.RESULT_FAILURE;
        }
    }
}

The Service Code block ;

public class DenemeService extends Service {



    Socket socket;

    public DenemeService() {
            Log.e("Deneme-App","Service Constuructor");

    }

    @Nullable
    @Override
    public IBinder onBind(Intent ıntent) {
        Log.e("Deneme-App", "Service Started");
        return null;
    }

    @Override
    public void onRebind(Intent intent) {
        Log.e("Deneme-App", "Service onRebind");
        super.onRebind(intent);
    }

    @Override
    public void onTaskRemoved(Intent rootIntent) {
        Log.e("Deneme-App", "Service onTaskRemoved");
        super.onTaskRemoved(rootIntent);
    }

    @Override
    public void onDestroy() {
        Log.e("Deneme-App", "Service onDestroy");
        super.onDestroy();
    }

    @Override
    public boolean onUnbind(Intent intent) {
        Log.e("Deneme-App", "Service onUnbind");
        return super.onUnbind(intent);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        Toast.makeText(getApplicationContext(), "OK", Toast.LENGTH_LONG).show();
        return START_REDELIVER_INTENT;
    }

    @Override
    public void onCreate() {
        Log.e("Deneme-App", "Service onCreate");
        super.onCreate();
    }

}

Manifest.xml

<service
    android:name=".BestTimeService"
    android:exported="true"
    android:permission="com.google.android.gms.permission.BIND_NETWORK_TASK_SERVICE">
    <intent-filter>
        <action android:name="com.google.android.gms.gcm.ACTION_TASK_READY" />
    </intent-filter>
</service>
<service android:name=".DenemeService" />

<receiver
    android:name=".BootReciever"
    android:enabled="true"
    android:exported="false"
    android:label="BootReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"></action>

    </intent-filter>
</receiver>
Somomo1q
  • 655
  • 2
  • 10
  • 19

1 Answers1

0

From Android API level 23 onwards, Android introduced two new power-saving features namely Doze and App Standby which puts more restrictions on Apps to be able to run continuously in the background. Specifically you may need to use a foreground service with a notification that users see on the lock screen or in the notification tray to avoid killing of the service by the Android System.

Please see this link for more details: https://developer.android.com/training/monitoring-device-state/doze-standby.

Narsinga
  • 1
  • 3