Android在應(yīng)用設(shè)置里關(guān)閉權(quán)限,返回生命周期處理

問題

在處理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ì)怎樣?流程圖如下圖片步驟

  • 原圖
01.png
  • 步驟一,打開通訊權(quán)限,并點(diǎn)擊允許
02.png
  • 步驟二,打開相機(jī)申請(qǐng)權(quán)限,并點(diǎn)擊拒絕
03.png
  • 步驟三,相機(jī)權(quán)限拒絕后彈出去設(shè)置對(duì)話框
去設(shè)置.png
  • 步驟四,點(diǎn)擊設(shè)置打開應(yīng)用設(shè)置


    04.png
  • 步驟五,點(diǎn)擊權(quán)限,打開權(quán)限設(shè)置,并關(guān)閉已經(jīng)申請(qǐng)成功的讀取通訊錄權(quán)限
05.png
06.png
  • 步驟六,點(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
LanchActivity.png
1501507953(1).png
  • MainActivity
MainActivity.png
1501507990(1).png
  • PremissionActivity


    PremissionActivity.png
1501508027(1).png
  • MyApplication 用于應(yīng)用重啟判斷
1501507895(1).png

啟動(dòng)程序

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

image.png

可以看得很清楚Application再次執(zhí)行,并且PremissionActivity界面也會(huì)重新被加載,并且savedInstanceState不為空!也可以知道程序此刻并不會(huì)啟動(dòng)啟動(dòng)頁LanchActivity!

此時(shí)按還回鍵會(huì)出現(xiàn)什么情況?看看打印結(jié)果:

image.png

可以看到會(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)頁!

處理如下:

image.png

疑難問題,關(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();


    }

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,725評(píng)論 25 709
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,502評(píng)論 19 139
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,031評(píng)論 4 61
  • Ubuntu的發(fā)音 Ubuntu,源于非洲祖魯人和科薩人的語言,發(fā)作 oo-boon-too 的音。了解發(fā)音是有意...
    螢火蟲de夢(mèng)閱讀 100,584評(píng)論 9 468
  • mysql在創(chuàng)建表時(shí)使用PARTITION BY子句定義每個(gè)分區(qū)存放的數(shù)據(jù)。在執(zhí)行查詢的時(shí)候優(yōu)化器會(huì)根據(jù)分區(qū)定義過...
    曉晨科科閱讀 583評(píng)論 0 0

友情鏈接更多精彩內(nèi)容