Android 8.0: java.lang.IllegalStateException: Not allowed to start service Intent

前端 未结 17 1205
借酒劲吻你
借酒劲吻你 2020-11-22 09:15

On application launch, app starts the service that should to do some network task. After targeting API level 26, my application fails to start service on Android 8.0 on back

17条回答
  •  遥遥无期
    2020-11-22 09:49

    Alternate solution by using JobScheduler, it can start service in background in regular interval of time.

    Firstly make class named as Util.java

    import android.app.job.JobInfo;
    import android.app.job.JobScheduler;
    import android.content.ComponentName;
    import android.content.Context;
    
    public class Util {
    // schedule the start of the service every 10 - 30 seconds
    public static void schedulerJob(Context context) {
        ComponentName serviceComponent = new ComponentName(context,TestJobService.class);
        JobInfo.Builder builder = new JobInfo.Builder(0,serviceComponent);
        builder.setMinimumLatency(1*1000);    // wait at least
        builder.setOverrideDeadline(3*1000);  //delay time
        builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED);  // require unmetered network
        builder.setRequiresCharging(false);  // we don't care if the device is charging or not
        builder.setRequiresDeviceIdle(true); // device should be idle
        System.out.println("(scheduler Job");
    
        JobScheduler jobScheduler = null;
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
            jobScheduler = context.getSystemService(JobScheduler.class);
        }
        jobScheduler.schedule(builder.build());
       }
      }
    

    Then, make JobService class named as TestJobService.java

    import android.app.job.JobParameters;
    import android.app.job.JobService;
    import android.widget.Toast;
     
      /**
       * JobService to be scheduled by the JobScheduler.
       * start another service
       */ 
    public class TestJobService extends JobService {
    @Override
    public boolean onStartJob(JobParameters params) {
        Util.schedulerJob(getApplicationContext()); // reschedule the job
        Toast.makeText(this, "Bg Service", Toast.LENGTH_SHORT).show();
        return true;
    }
    
    @Override
    public boolean onStopJob(JobParameters params) {
        return true;
      }
     }
    

    After that BroadCast Receiver class named ServiceReceiver.java

    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    
     public class ServiceReceiver extends BroadcastReceiver {
     @Override
    public void onReceive(Context context, Intent intent) {
        Util.schedulerJob(context);
     }
    }
    

    Update Manifest file with service and receiver class code

    
            
                
            
        
        
    
        
    

    Left main_intent launcher to mainActivity.java file which is created by default, and changes in MainActivity.java file are

    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    
    public class MainActivity extends AppCompatActivity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Util.schedulerJob(getApplicationContext());
      }
     }
    

    WOOAAH!! Background Service starts without Foreground service

    [Edit]: You can use Work Manager for any type of background tasks in Android.

提交回复
热议问题