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

Y.S*_*Y.S 22 android android-activity android-permissions activity-manager android-6.0-marshmallow

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

在此输入图像描述

值得注意的是,当恢复时,应用程序会从最后一次重新开始Activity.操作系统显然跟踪Activity用户访问的最后一次.

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

我的问题是,有没有办法强制应用程序从Activity应用程序的第一个重新启动,而不是用户将其保留的应用程序?

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

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

这种行为当然在以前被观察过:

1. Android预览M:在权限授予后重新创建活动

2. 启用/禁用Android M nexus 6上的设置权限后,应用程序将被终止

3. Android Marshmallow:运行应用程序的权限更改

4. 按"重置应用偏好设置"后,我的应用的所有权限都被撤消

5. Android 6权限 - 在设置中切换权限时崩溃并返回应用程序

小智 1

你是这个意思吗?

主要活动:

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();
        }
    });
}
}
Run Code Online (Sandbox Code Playgroud)

活动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;
        }
    }
}
}
Run Code Online (Sandbox Code Playgroud)

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


归档时间:

查看次数:

3667 次

最近记录:

6 年,2 月 前