5 回答
您应该使用此处提供的、保存的更多信息来处理(重新)Activity
创建。Bundle
onCreate
onSaveInstanceState
传递Bundle
您需要的所有内容,以便从以前的状态中恢复并无缝恢复您的 UI。你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();
}
});
}
}
活动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 以及恢复时出现权限对话框。
您可以按照以下步骤进行操作。
- 创建一个扩展AppcompatActivity的Base Activity以维护所有权限并检查onResume()权限。
- 从所有活动中扩展基本活动。
- 如果任何权限被拒绝,您可以从Base Activity做任何您想做的事情。
快乐编码!:)
我不知道是否有人仍在寻找这个问题的答案,但我会通过颠倒逻辑来解决,而不是等待由于拒绝许可而指示重新启动/重新创建的标志,而是传递一个指示Activity 是由另一个 Activity 启动的,而不是由系统重新创建的。因此,如果 FLAG 没有附加功能,则必须销毁活动堆栈并启动第一个活动。
希望它可以帮助某人。
您应该在onResume
回调中放置代码来检查权限状态。如果用户切换到系统设置权限活动,您的活动将暂停。如果用户启用了权限,然后返回到您的 Activity,onResume
则将被调用,此时您将有机会检查新权限。然后,您可以做任何您需要重新启动 Activity 的操作,例如startActivity
使用具有FLAG_ACTIVITY_NEW_TASK
并FLAG_ACTIVITY_CLEAR_TASK
再次启动您的 Activity 的 Intent 调用。
override fun onResume() {
super.onResume()
// check for permission
checkPermissionsAndRestartIfNecessary()
}
private fun checkPermissionsAndRestartIfNecessary() {
if (ContextCompat.checkSelfPermission(...) {
...
}
}