28
4

5 回答 5

1

您应该使用此处提供的、保存的更多信息来处理(重新)Activity创建。BundleonCreateonSaveInstanceState

传递Bundle您需要的所有内容,以便从以前的状态中恢复并无缝恢复您的 UI。你Activity可以通过多种原因重新创建,取消权限只是其中之一,屏幕旋转是另一个,所以只要你能活下来,你就能活下来。

于 2018-10-10T19:27:56.517 回答
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();
        }
    });
}
}

活动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 以及恢复时出现权限对话框。

于 2017-01-30T11:18:32.383 回答
0

您可以按照以下步骤进行操作。

  1. 创建一个扩展AppcompatActivity的Base Activity以维护所有权限并检查onResume()权限。
  2. 从所有活动中扩展基本活动。
  3. 如果任何权限被拒绝,您可以从Base Activity做任何您想做的事情。

快乐编码!:)

于 2020-12-28T06:47:25.280 回答
0

我不知道是否有人仍在寻找这个问题的答案,但我会通过颠倒逻辑来解决,而不是等待由于拒绝许可而指示重新启动/重新创建的标志,而是传递一个指示Activity 是由另一个 Activity 启动的,而不是由系统重新创建的。因此,如果 FLAG 没有附加功能,则必须销毁活动堆栈并启动第一个活动。

希望它可以帮助某人。

于 2019-10-02T20:33:58.993 回答
0

您应该在onResume回调中放置代码来检查权限状态。如果用户切换到系统设置权限活动,您的活动将暂停。如果用户启用了权限,然后返回到您的 Activity,onResume则将被调用,此时您将有机会检查新权限。然后,您可以做任何您需要重新启动 Activity 的操作,例如startActivity使用具有FLAG_ACTIVITY_NEW_TASKFLAG_ACTIVITY_CLEAR_TASK再次启动您的 Activity 的 Intent 调用。

override fun onResume() {
  super.onResume()

  // check for permission
  checkPermissionsAndRestartIfNecessary()
}

private fun checkPermissionsAndRestartIfNecessary() {
  if (ContextCompat.checkSelfPermission(...) {
    ...
  }
}
于 2020-12-28T19:02:37.193 回答