android - 强制应用程序从第一个 Activity 重新启动(当权限被拒绝时)

标签 android android-activity android-6.0-marshmallow android-permissions activity-manager

众所周知,当我们在 Android 6.0 运行时拒绝权限并恢复应用程序从最近的菜单,应用进程被杀死并且应用强制重启。据称这是为了防止任何安全问题:

enter image description here

值得注意的是,在恢复时,应用会从我们上次打开的 Activity 重新启动。 操作系统显然会跟踪用户访问的最后一个Activity

不幸的是,这是一个问题,因为它破坏了业务逻辑的流程。不允许用户以这种方式中途访问应用。

我的问题是,有没有办法强制应用程序从应用程序的第一个 Activity 重新启动,而不是用户离开它的那个?

是否有与应用程序重启/进程终止/权限切换相关的回调?

这是一个错误的方法吗?如果是这样,怎么做?正确的方法是什么?

这种行为当然以前曾观察到过:

1. Android Preview M: activity recreates after permission grant

2. Application is getting killed after enable/disable permissions from settings on Android M nexus 6

3. Android Marshmallow: permissions change for running app

4. All the permissions of my app are revoked after pressing “Reset app preferences”

5. Android 6 permission - Crashes when toggling permission in Setting and go back to app

最佳答案

你是这个意思吗?

主 Activity :

public class MainActivity extends AppCompatActivity {

TextView txt;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    txt = (TextView)findViewById(R.id.txt);

    txt.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Intent intent = new Intent(MainActivity.this, ActivityB.class);
            intent.putExtra("from","MainActivity");
            startActivity(intent);
            finish();
        }
    });
}
}

Activity B:

    public class ActivityB extends AppCompatActivity {

String intentTxt="";
final int MY_PERMISSIONS_REQUEST_PHONE_CALL = 1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_b);
    intentTxt = getIntent().getStringExtra("from");
}


@Override
protected void onResume() {
    super.onResume();
    if(intentTxt.equals("MainActivity")) {
        if (ContextCompat.checkSelfPermission(ActivityB.this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

            ActivityCompat.requestPermissions(ActivityB.this, new String[]{android.Manifest.permission.CALL_PHONE},
                    MY_PERMISSIONS_REQUEST_PHONE_CALL);
        }
    }
        intentTxt = "";
}

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_PHONE_CALL: {
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + "32434"));
                startActivity(intent);

            } else {

                Intent intent = new Intent(ActivityB.this,MainActivity.class);
                startActivity(intent);
                finish();
            }
            return;
        }
    }
}
}

您可以从ActivityB的onRequestPermissionsResult启动splashActivity/HomeActivity。在ActivityB的onResume中检查权限,以便在第一次调用ActivityB时以及在恢复时出现权限对话框。

关于android - 强制应用程序从第一个 Activity 重新启动(当权限被拒绝时),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39204052/

相关文章:

java - Android Studio 3.0 中任务 ':app:processDebugManifest' 执行失败

java - 如何更改Unity Android插件包名称

java - 在 Java 中高效地向同一 url 发出多个 GET 请求

android - 清除 Activity 堆栈并从 Android 服务启动新 Activity

android - 错误 <declare-styleable> MenuView,无法找到属性 android :preserveIconSpacing

android - 我的应用程序不会显示在 android.intent.action.VIEW 的选择器对话框中,mime 类型为 video/* only on Marshmallow

android - Android 6 (Marshmallow) 中的 PopupWindow 昏暗背景

java - Android 和 C++ : Necessary?

android - 停止并取消绑定(bind) Android 中不同 Activity 的服务

java - 无法加载带有 fragment 的 Activity