无法检测后台服务

时间:2019-12-10 19:25:35

标签: android android-service

我创建了一个应用,在其中增加存储在数据库中的数字并更新数据库中的数字。当应用被杀死时,将发送广播,而接收方广播将执行与上述操作相同的操作。 我面临的问题是,当打开应用程序时,它将查看后台服务是否正在运行。但是,即使我编写了一个方法,当后台服务实际上正在运行时,它也无法检测到。 我收到以下错误

2019-12-11 00:40:24.061 21588-21588/? E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.myapplication, PID: 21588
    java.lang.RuntimeException: Unable to start receiver com.example.myapplication.SensorRestarterBroadcastReceiver: java.lang.IllegalStateException: Not allowed to start service Intent { cmp=com.example.myapplication/.MyService }: app is in background uid UidRecord{42ec1a7 u0a240 RCVR idle procs:1 seq(0,0,0)}

这是我的主要活动和服务活动。

Main Activity.java

public class MainActivity extends AppCompatActivity {

    TextView t1;

    DatabaseAccess databaseAccess;
    Intent mServiceIntent;
    private MyService mSensorService;
    Context ctx;
    public Context getCtx() {
        return ctx;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ctx = getApplicationContext();
        setContentView(R.layout.activity_main);

        int value = 0;

        databaseAccess=DatabaseAccess.getInstance(getApplicationContext());
        databaseAccess.open();
        value=databaseAccess.readValue();
        databaseAccess.close();

        t1=findViewById(R.id.text);
        t1.setText(""+value);

        mSensorService = new MyService(getCtx());
        mServiceIntent = new Intent(getCtx(), MyService.class);
        boolean stats=isMyServiceRunning(MyService.class);
        if (!stats) {
            startService(mServiceIntent);
        }
    }

    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
    protected void onDestroy() {
        super.onDestroy();
        stopService(mServiceIntent);
    }
}

MyService.java

public class MyService extends Service {
    public int inValue;
    DatabaseAccess databaseAccess;

    public MyService(Context applicationContext) {
        super();
    }

    public MyService() {
    }

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

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        super.onStartCommand(intent, flags, startId);
       //Read the database and increment the value in the counter which is available
        databaseAccess = DatabaseAccess.getInstance(getApplicationContext());
        databaseAccess.open();
        inValue = databaseAccess.readValue();
        databaseAccess.close();
        incremental(inValue);
       return START_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Intent broadcastIntent = new Intent(this,SensorRestarterBroadcastReceiver.class);
        sendBroadcast(broadcastIntent);
    }

    public void incremental(int i) {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
        }
        i=i+1;
        databaseAccess=DatabaseAccess.getInstance(getApplicationContext());
        databaseAccess.open();
        databaseAccess.updateValue(i);
        databaseAccess.close();
    }
}

0 个答案:

没有答案