众所周知,当我们在 Android 6.0 运行时拒绝权限并恢复应用程序从最近的菜单,应用进程被杀死并且应用强制重启。据称这是为了防止任何安全问题:
值得注意的是,在恢复时,应用会从我们上次打开的 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/