Java onCreate被调用两次,导致应用程序过早退出

Java onCreate被调用两次,导致应用程序过早退出,java,android,Java,Android,我浏览了其他SO帖子,但没有发现任何与我的问题相关的东西 我正在尝试创建一个应用程序,该应用程序将从上次重新启动中获取用户的步数。以下是我的主要活动: package com.assignment.bwowassignment; import android.content.pm.PackageManager; import android.os.Build; import android.os.Bundle; import android.util.Log; import androidx

我浏览了其他SO帖子,但没有发现任何与我的问题相关的东西

我正在尝试创建一个应用程序,该应用程序将从上次重新启动中获取用户的步数。以下是我的主要活动:

package com.assignment.bwowassignment;

import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;

import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.app.AppCompatDelegate;

import java.util.Arrays;

public class MainActivity extends AppCompatActivity implements MainActivityContract.View {

    MainActivityPresenter presenter;

    @RequiresApi(api = Build.VERSION_CODES.Q)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);

        Log.d("mihir", "hello");
        presenter = new MainActivityPresenter(this);
        presenter.requestActivityPermission(this);
    }

    @Override
    public void onGetStepsSuccess(float[] values) {
        Log.d("mihir", Arrays.toString(values));
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == presenter.ACTIVITY_REQUEST_CODE)
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
                presenter.registerListener(this);
            else {
                Log.d("mihir", "kill me");
                finish();
            }
    }

    @Override
    protected void onPause() {
        super.onPause();
        presenter.sensorManager.unregisterListener(presenter);
    }
}
MainActivityPresenter.java

package com.assignment.bwowassignment;

import android.Manifest;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.pm.PackageManager;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Build;
import android.util.Log;

import androidx.annotation.RequiresApi;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import java.util.logging.Logger;

public class MainActivityPresenter implements MainActivityContract.Presenter, SensorEventListener {

    MainActivityContract.View view;
    SensorManager sensorManager;
    Sensor sensor;

    public MainActivityPresenter(MainActivityContract.View view) {
        this.view = view;
        sensorManager = (SensorManager) ((Context) view).getSystemService(Context.SENSOR_SERVICE);
        sensor = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER);
    }

    @Override
    public void registerListener(Context context) {
        sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_NORMAL);
    }

    @RequiresApi(api = Build.VERSION_CODES.Q)
    @Override
    public void requestActivityPermission(Context context) {
        if (ContextCompat.checkSelfPermission(context, Manifest.permission.ACTIVITY_RECOGNITION) == PackageManager.PERMISSION_GRANTED)
            registerListener(context);
        else if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) context, Manifest.permission.ACTIVITY_RECOGNITION))
            new AlertDialog.Builder(context)
                    .setTitle("Permission required")
                    .setMessage("This permission is required to fetch the sensor data from your phone, denying it will cause the app to exit")
                    .setPositiveButton("Give permission", (dialog, which) -> ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.ACTIVITY_RECOGNITION}, ACTIVITY_REQUEST_CODE))
                    .setNegativeButton("Deny", (dialog, which) -> ((Activity) context).finish())
                    .show();
        else
            ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.ACTIVITY_RECOGNITION}, ACTIVITY_REQUEST_CODE);
    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        view.onGetStepsSuccess(event.values);
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }
}
MainActivityContract.java

package com.assignment.bwowassignment;

import android.content.Context;

public interface MainActivityContract {

    interface View {
        void onGetStepsSuccess(float[] values);
    }

    interface Presenter {
        int ACTIVITY_REQUEST_CODE = 1;

        void registerListener(Context context);
        void requestActivityPermission(Context context);
    }
}
正如您可以看到的,标签中有两个日志,其中我的名字,这里发生的是“hello”日志被记录了两次。我猜这是第一个onCreate,它负责在启动前完成我的应用程序,因为我在logcat中收到了以下警告:

W/活动:一次只能请求一组权限

我只请求了一个权限,但是由于onCreate被调用了两次,第一个权限会被自动拒绝,这会导致应用程序在启动之前
finish()
!从昨天起我就一直在为这件事挠头,非常感谢您的帮助

我想出来了

罪魁祸首是这样的:
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE\u NIGHT\u NO)

显然,这会导致配置更改,导致调用
onCreate
方法两次,为了克服这个问题,在调用onCreate中的super之前调用它,如下所示:

AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);