在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啊,全局变量啊,你会发现都没了