我正在尝试在OnDestroy ()
中调用服务,但没有日志在起作用,有人知道为什么吗?
@Override
protected void onDestroy() {
Log.e("onDestroy", "here");
startService(new Intent(this, ServiceOff.class));
super.onDestroy();
}
如果我在onStop上调用该服务,则即使它在我关闭应用程序时也被调用,该服务仍会运行,但是由于onStop仍然可以打开该应用程序的明显原因,因此无法在该处调用。
重要的是,我正在通过拉动窗口模式并拖动侧面来关闭应用程序
完整的活动代码:
public class editar_perfil extends AppCompatActivity {
FloatingActionButton ok;
TextInputEditText senha, new_senha;
ProgressBar login_progress;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_editar_perfil);
reference();
}
private void reference() {
ok = findViewById(R.id.ok);
senha = findViewById(R.id.senha);
new_senha = findViewById(R.id.new_senha);
login_progress = findViewById(R.id.login_progress);
ok.setOnClickListener(v ->{
if(conectV(this)) {
if (ge(senha).length() > 7 && ge(new_senha).length() > 7) {
String paramentros = "session=" + session +
"&id=" + meu_id +
"&senha=" + ge(senha) +
"&new_senha=" + ge(new_senha);
stateAll(false, senha, new_senha, ok);
showProgress(true, login_progress, this);
new SolicitaDados(paramentros).execute(url + "new_senha.php");
} else {
Toast.makeText(this, "Tamanho de senha inválido!", Toast.LENGTH_SHORT).show();
}
}else{
Toast.makeText(this, "Sem conexão com a internet!", Toast.LENGTH_SHORT).show();
}
});
}
public class SolicitaDados extends AsyncTask<String, Void, String> {
private String parametros;
private SolicitaDados(String paramentros) {
this.parametros = paramentros;
Log.e("script", paramentros);
}
@Override
protected String doInBackground(String... urls) {
return Conexao.postDados(urls[0], this.parametros);
}
@Override
protected void onPostExecute(String resultado) {
if (resultado != null) {
Log.e("res", resultado);
if(resultado.contains("ok")){
Toast.makeText(editar_perfil.this, "Senha alterada com sucesso!", Toast.LENGTH_SHORT).show();
finish();
}else{
stateAll(true, senha, new_senha, ok);
showProgress(false, login_progress, editar_perfil.this);
Toast.makeText(editar_perfil.this, "Senha antiga incorreta, tente novamente!", Toast.LENGTH_SHORT).show();
}
}else{
stateAll(true, senha, new_senha, ok);
showProgress(false, login_progress, editar_perfil.this);
Toast.makeText(editar_perfil.this, "Erro inesperado, tente novamente!", Toast.LENGTH_SHORT).show();
}
}
}
@Override
protected void onDestroy() {
Log.e("onDestroy", "here");
startService(new Intent(this, ServiceOff.class));
super.onDestroy();
}
}
答案 0 :(得分:2)
来自onDestroy文档:
在销毁活动之前执行所有最终清除。之所以会发生这种情况,可能是因为该活动即将结束(有人称其为finish(),或者是因为该系统正在临时销毁该活动实例以节省空间。您可以使用isFinishing()方法来区分这两种情况。>
您的活动可能仍然存在,这就是为什么不调用onDestroy的原因。
我不知道完整的代码,因此很难说出要实现的目标,也许onPause()或onStop()可以解决问题。
答案 1 :(得分:1)
您需要遵循一些步骤:
步骤1:创建一个新类,并使用BroadcastReceiver对其进行扩展:
public class Reciever extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// Added a toast just to check but you can also add startService() here
Toast.makeText(context, "Hello", Toast.LENGTH_SHORT).show();
}
}
第2步:在清单中注册接收者:
<receiver android:name=".Reciever"
android:process=":remote" /> // This is important
步骤3:然后在您的主要活动中注册一个警报管理器:
Intent alarmIntent = new Intent(MainActivity.this,
Reciever.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this,
0, alarmIntent, 0);
AlarmManager manager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
assert manager != null;
manager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(),
60000L /*AlarmManager.INTERVAL_HALF_HOUR*/, pendingIntent);
第4步:滑动您的应用程序将其杀死,一段时间后,您将看到警报管理器将触发您的onRecieve()方法。
您需要在设备上留心手表,以查看其是否正常运行。
看看它是否有效,请给我更新。
答案 2 :(得分:0)
尝试这样:
@Override
protected void onDestroy() {
super.onDestroy();
Log.e("onDestroy", "here");
startService(new Intent(context, ServiceOff.class));
}
希望它能起作用。