問題
在處理6.0運(yùn)行時(shí)權(quán)限時(shí),很多人都忽略了這樣一個(gè)問題:
在一個(gè)App應(yīng)用里,如果已經(jīng)允許了一個(gè)權(quán)限比如(讀取通訊權(quán)限),此刻去調(diào)用相機(jī),彈出權(quán)限申請(qǐng)對(duì)話框,此刻點(diǎn)擊拒絕,然后經(jīng)過處理后彈出去設(shè)置權(quán)限界面(因?yàn)闄?quán)限總歸是要申請(qǐng)),如果再在置界面里打開應(yīng)用權(quán)限設(shè)置,此刻不但不打開相機(jī)權(quán)限反而將已經(jīng)申請(qǐng)的讀取通訊錄權(quán)限關(guān)閉會(huì)怎樣?流程圖如下圖片步驟:
- 原圖

- 步驟一,打開通訊權(quán)限,并點(diǎn)擊允許

- 步驟二,打開相機(jī)申請(qǐng)權(quán)限,并點(diǎn)擊拒絕

- 步驟三,相機(jī)權(quán)限拒絕后彈出去設(shè)置對(duì)話框

-
步驟四,點(diǎn)擊設(shè)置打開應(yīng)用設(shè)置
04.png - 步驟五,點(diǎn)擊權(quán)限,打開權(quán)限設(shè)置,并關(guān)閉已經(jīng)申請(qǐng)成功的讀取通訊錄權(quán)限


- 步驟六,點(diǎn)擊還回按鍵,回到自己的App
分析
經(jīng)過以上的步驟可以發(fā)現(xiàn),當(dāng)權(quán)限關(guān)閉后應(yīng)用會(huì)重新啟動(dòng),并且會(huì)默認(rèn)直接打開權(quán)限申請(qǐng)的那個(gè)界面,不會(huì)打開啟動(dòng)頁,為什么呢,因?yàn)楫?dāng)權(quán)限關(guān)閉后,程序會(huì)被殺人,Activity是異常結(jié)束的,當(dāng)返回是,app會(huì)默認(rèn)修復(fù)最后打開的那個(gè)界面。
證實(shí)
上面的分析接下來一一證實(shí),為了讓權(quán)限申請(qǐng)界面避開自己是啟動(dòng)頁界面,我將會(huì)在寫兩個(gè)界面,界面跳轉(zhuǎn)步驟是
LanchActivity----》MainActivity----》PremissionActivity
- LanchActivity


- MainActivity


-
PremissionActivity
PremissionActivity.png

- MyApplication 用于應(yīng)用重啟判斷

啟動(dòng)程序
啟動(dòng)程序,并且按照上面的步驟去關(guān)閉權(quán)限然后還回,看看打印結(jié)果

可以看得很清楚Application再次執(zhí)行,并且PremissionActivity界面也會(huì)重新被加載,并且savedInstanceState不為空!也可以知道程序此刻并不會(huì)啟動(dòng)啟動(dòng)頁LanchActivity!
此時(shí)按還回鍵會(huì)出現(xiàn)什么情況?看看打印結(jié)果:

可以看到會(huì)按正常的返回回到啟動(dòng)頁,但是啟動(dòng)頁和主界面都是異常殺死的,所以savedInstanceState都會(huì)有數(shù)據(jù)
總結(jié)
有了以上的測(cè)試就可以知道權(quán)限被強(qiáng)行關(guān)閉后的生命周期,有的時(shí)候程序有很多數(shù)據(jù),關(guān)閉權(quán)限還回后,有些數(shù)據(jù)丟失并不能恢復(fù),就會(huì)出現(xiàn)空指針異常的情況!所以這里可以按照微信的設(shè)計(jì)思路就是:
強(qiáng)行關(guān)閉權(quán)限后,讓程序重新打開啟動(dòng)頁!
處理如下:

疑難問題,關(guān)閉程序后返回會(huì)出現(xiàn)一下白屏的問題!目前還不知如何解決這個(gè)問題,請(qǐng)告知!
PremissionActivity代碼:
public class PremissionActivity extends AppCompatActivity {
private static final int REQUEST_CAMERA_PERMISSION = 0x103;
private static final int REQUEST_PRE_SET = 0x104;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.e("PNH", "PremissionActivity啟動(dòng)savedInstanceState=" + savedInstanceState);
if (null != savedInstanceState) {
Intent intent = new Intent(this, LanchActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
}
setContentView(R.layout.activity_premission);
findViewById(R.id.camera).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (ContextCompat.checkSelfPermission(PremissionActivity.this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(PremissionActivity.this, new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION);
}
}
});
findViewById(R.id.contact).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 檢查是否已經(jīng)具有權(quán)限
if (ContextCompat.checkSelfPermission(PremissionActivity.this, Manifest.permission.READ_CONTACTS)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(PremissionActivity.this, new String[]{Manifest.permission.READ_CONTACTS}, 3);
}
}
});
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_CAMERA_PERMISSION) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
} else {
//權(quán)限拒絕
openAppSetting();
}
}
}
protected void openAppSetting() {
MaterialDialog materialDialog = new MaterialDialog.Builder(this)
.content("在設(shè)置-應(yīng)用-GcsSloop-權(quán)限中開啟相機(jī)權(quán)限,以正常使用拍照、小視頻、掃一掃等功能")
.positiveText("去設(shè)置")
.negativeText("取消")
.onNegative(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
}
})
.onPositive(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
// Intent intent = new Intent("/");
// ComponentName cm = new ComponentName("com.android.settings","com.android.settings.ManageApplications");
// intent.setComponent(cm);
// intent.setAction("android.intent.action.VIEW");
// startActivityForResult( intent , 0);
// 打開權(quán)限設(shè)置界面
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.parse("package:" + getPackageName()));
// 申請(qǐng)權(quán)限返回執(zhí)行
startActivityForResult(intent, REQUEST_PRE_SET);
}
}).build();
materialDialog.show();
}
}

