手动收回应用权限对android app的影响

在android开发中不可避免的要申请一些权限,用户允许之后就可以酣畅淋漓使用我们的app了
可是如果用户在使用app期间,将app至于后台去应用设置页面禁止了app的权限,那么这个时候将app恢复到前台会发生什么呢?

先说结论吧:

1 app进程被杀死并重启一个新的进程

既然是重启一个新的进程,是不是重新打开下面属性指定的Activity?

 <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>

2 会按照之前存在的activity栈信息创建新进程,之前有多少个activity现在还有多少个,之前的顺序是什么现在还是什么,之前停留在哪个activity现在还会停留在哪个activity,但是每个activity之前的方法都无效了,都需要重新走一遍onCreate(Bundle savedInstanceState)方法

口说无凭,我们测试一下

清单文件中申请地理位置权限

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.justtest">
<uses-permission-sdk-23 android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:name=".TestApplication"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".activitys.Main2Activity">
        </activity>
        <activity android:name=".activitys.MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
public class TestApplication extends Application {
    public static String T="deafult";


    @Override
    public void onCreate() {
        super.onCreate();
        Log.i("TAG", "LCJ: TestApplication pid= " + android.os.Process.myPid());
    }
}
public class MainActivity extends AppCompatActivity {

    private Button btn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TestApplication.T = "你好";
        initView();
        Log.i("TAG", "LCJ: MainActivity savedInstanceState== "+savedInstanceState);
        Log.i("TAG", "LCJ: MainActivity onCreate");
    }



    private void initView() {
        btn = findViewById(R.id.btn);
        btn.setText(TestApplication.T);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this,Main2Activity.class));
            }
        });
    }
}
public class Main2Activity extends AppCompatActivity {

    private Button btnFinish;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        Log.i("TAG", "LCJ: MainActivity2 onCreate");
        Log.i("TAG", "LCJ: MainActivity2 TestApplication.T "+TestApplication.T);
        Log.i("TAG", "LCJ: MainActivity2 savedInstanceState== "+savedInstanceState);
        initView();
    }

    private void initView() {
        btnFinish = findViewById(R.id.btn_finish);
        btnFinish.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });
    }
}

这个时候我们启动app log日志如下

2019-05-15 16:36:02.588 7726-7726/? I/TAG: LCJ: TestApplication pid= 7726
2019-05-15 16:36:02.896 7726-7726/? I/TAG: LCJ: MainActivity savedInstanceState== null
2019-05-15 16:36:02.896 7726-7726/? I/TAG: LCJ: MainActivity onCreate
2019-05-15 16:36:05.977 7726-7726/com.justtest I/TAG: LCJ: MainActivity2 onCreate
2019-05-15 16:36:05.977 7726-7726/com.justtest I/TAG: LCJ: MainActivity2 TestApplication.T 你好
2019-05-15 16:36:05.977 7726-7726/com.justtest I/TAG: LCJ: MainActivity2 savedInstanceState== null

我们可以看到这个进程id为7726,然后MainActivity调用onCreate,点击按钮之后跳转到MainActivity2也是调用了onCreate方法,注意这里的savedInstanceState都是null
到这里都很正常,和我们预期的一模一样

好,现在我们将应用至于后台去进程中打开地理位置权限

日志没有任何变化——手动允许相应权限不会影响在后台的应用

我们现在禁止地理位置权限,发现进程被杀死但是还没有创建新的进程
在这里插入图片描述
这个时候将app恢复到前台

在这里插入图片描述
我们发现进程id变成了8182,这是一个新建的进程,我们的活动页面也停留在MainActivity2中并且调用了onCreate方法,注意此时savedInstanceState不为空,这个时候这个savedInstanceState是有值得,说明这是android系统帮忙恢复的

这个时候关闭MainActivity2,看看会发生什么?

在这里插入图片描述
没错,还是按照之前的栈顺序回到了MainActivity,并且调用了onCreate方法,注意此时的savedInstanceState也不为空

至此好像真相大白了,可是我们这里需要注意什么呢?

旧的进程被杀标志着旧进程里面的变量数据被清空了
新的进程是没有这些数据的,当你还天真的以为自己可以获取到之前设置的token啊,全局变量啊,你会发现都没了

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值