ANR проблемы с широковещательным приемником в службе
Моя цель - запустить сервис, который прослушивает изменения состояния экрана устройства (вкл или выкл) и воздействует на эти изменения. Я осознаю, что это не идеально, но, тем не менее, это то, что я пытаюсь достичь.
По какой-то причине мой вещательный приемник, кажется, срабатывает только при включении экрана, но не при его выключении. Кроме того, logcat обнаруживает многочисленные ANR, и кажется, что служба неоднократно уничтожается и перезапускается.
Я следовал учебник нашел: здесь
Вот мой соответствующий код:
ScreenReceiver.java
public class ScreenReceiver extends BroadcastReceiver {
private boolean screenOff;
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
screenOff = true;
} else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
screenOff = false;
}
Intent i = new Intent(context, UpdateService.class);
i.putExtra("screen_state", screenOff);
context.startService(i);
}
}
UpdateService.java (обновляется согласно предложению, теперь вызывает принудительное закрытие)
public class UpdateService extends IntentService {
public UpdateService(String name) {
super(name);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate() {
super.onCreate();
// register receiver that handles screen on and screen off logic
IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
BroadcastReceiver mReceiver = new ScreenReceiver();
registerReceiver(mReceiver, filter);
}
@Override
protected void onHandleIntent(Intent intent) {
boolean screenOn = intent.getBooleanExtra("screen_state", false);
if (!screenOn) {
String command8 = "*******";
String command9 = "*********";
int timeout = 5;
try {
RootTools.Result result = new RootTools.Result() {
@Override
public void process(String line) throws Exception {
// Do something with current line;
// Maybe store it using setData()
}
@Override
public void onFailure(Exception ex) {
// Do something if we failed while trying to run a command or read its output
setError(1);
}
@Override
public void onComplete(int diag) {
}
};
RootTools.sendShell(
new String[] {
command8,
command9},
timeout,
result
);
if(0 != result.getError())
return;
//Do something with getData() if needed.
} catch (IOException e) {
//Handle exception
} catch (InterruptedException e) {
//Handle exception
} catch (RootToolsException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
} else {
String command8 = "*******";
String command9 = "*******";
String command10 = "********";
String command11 = "********";
int timeout = 5;
try {
RootTools.Result result = new RootTools.Result() {
@Override
public void process(String line) throws Exception {
// Do something with current line;
// Maybe store it using setData()
}
@Override
public void onFailure(Exception ex) {
// Do something if we failed while trying to run a command or read its output
setError(1);
}
@Override
public void onComplete(int diag) {
//TODO
}
};
RootTools.sendShell(
new String[] {
command8,
command9,
command10,
command11},
timeout,
result
);
if(0 != result.getError())
return;
//Do something with getData() if needed.
} catch (IOException e) {
//Handle exception
} catch (InterruptedException e) {
//Handle exception
} catch (RootToolsException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
}
}
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
}
Приемник вещания запускается нажатием кнопки с этим кодом:
IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
BroadcastReceiver mReceiver = new ScreenReceiver();
registerReceiver(mReceiver, filter);
1 ответ
onStart()
не просто устарел, но вызывается в главном потоке приложения. Определение ANR состоит в том, что вы тратите слишком много времени на основной поток приложения. Пожалуйста, переместите onStart()
логика в фоновом потоке, возможно, путем подклассов IntentService
и положить логику в onHandleIntent()
,