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