OnDestroy中的调用方法不起作用

时间:2018-08-22 07:02:57

标签: android

我正在尝试在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();
    }
}

3 个答案:

答案 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));
}

希望它能起作用。