本文为Android的Activity相关知识整理,具体参考了
Activity是与用户交互的第一接口。
Activity具有多种形态。其生命周期图如下:
其中,有三个稳定态,其他都是过渡态:
(以下均指MainActivity的生命周期)
注意:
以下几种情况下,Activity的生命周期会发生异常 1,资源相关的系统配置发生改变 比如,旋转屏幕,在默认状态下,Activity就会被销毁并且重新创建。
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(savedInstanceState != null){
String test = savedInstanceState.getString("extre_test");
Log.d(TAG, test);
}
}
@Override
protected void onSaveInstanceState(Bundle outState){
super.onSaveInstanceState(outState);
outState.putString("extre_test", "test");
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState){
super.onRestoreInstanceState(savedInstanceState);
String test = savedInstanceState.getString("extre_test");
Log.d(TAG, test);
}
执行顺序: 1 onPause() 2 onSaveInstanceState(Bundle outState) 3 onStop() 4 onDestory() 5 onCreate(Bundle savedInstanceState) 6 onStart() 7 onRestoreInstanceState(Bundle savedInstanceState)
注意:系统仅仅在Activity异常终止时才会调用onRestoreInstanceState()。
2,系统内存不足 此时的系统中数据的存储和恢复情况和上面第一种情况一致。Activity优先级如下:
1 前台Activity 2 可见但非前台Activity 3 后台Activity 当系统资源不足的时候,会按照这个优先级使用onSaveInstanceState()和onRestoreInstanceState()来存储和恢复数据。
还有一些后台进程不是四大组件,这样就会很容易被杀死~~ 一般是将这些后台工作放入Service中,从而保证有一定的优先级。
PS:阻止Activity被重新创建
使用android:configChanges="orientation|screenSize"属性。
常用属性:
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:configChanges="orientation|screenSize|keyboardHidden" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
@Override
public void onConfigurationChanged(Configuration newConfig){
super.onConfigurationChanged(newConfig);
......//当系统配置发上变换时,进行的工作
}
Android的APP通常会有多个Activity,各个Activity之间通过Intent进行连接,系统通过栈结构来保存整个APP的Activity。系统有两种方式控制Activity的启动模式。
在AndroidMainifest.xml文件里面的activity标签设置启动模式。
<activity
android:name=".FirstActivity"
android:launchMode="singleTop"
android:label="This is FirstActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
TaskAffinity taskAffinity,任务相关性。xml中的一个属性,标识了一个Activity所需要的任务栈的名字。默认是包名。如果设置了其他的名字如com.test.task1,那启动它的时候就会新建一个名为com.test.task1的任务栈。
<activity
android:name="com.test.task0.MainActivity"
android:label="@string/app_name"
android:launchMode="standard">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category andorid:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
andorid:name="com.test.SecondActivity"
android:taskAffinity="com.test.task1"
android:label="@string/app_name"
android:launchMode="singleTask"/>
<activity
andorid:name="com.test.ThirdActivity"
android:taskAffinity="com.test.task1"
android:label="@string/app_name"
android:launchMode="singleTask"/>
如果从MainActivity启动SecondActivity,然后再启动ThirdActivity,那么任务栈如下: com.test.task0 MainActivity com.test.task1 SecondActivity ThirdActivity 若再从ThirdActivity启动MainActivity,那么任务栈如下: com.test.task0 MainActivity com.test.task1 SecondActivity ThirdActivity MainActivity
对Intent进行设置
Intent intent = new Intent();
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
重要的Flag:
<activity android:name="SecondActivity">
<intent-filter>
<action android:name="android.intent.action.SEND">
<category android:name="android.intent.category.DEFAULT">
<data android:mimeType="text/plain">
</intent-filter>
</activity>
调用一个Activity主要包括两种: 1,显式调用。
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent);
2, 隐式调用
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setDataAndType(Uri.parse("file://abc"), "text/plain");
startActivity(intent);
隐式调用需要Intent能够匹配目标组件的IntentFilter中的过滤信息。 IntentFilter中的过滤信息有action, category, data。 只有一个Intent同时匹配这三个类别才能启动目标Activity。
<activity android:name=".MainActivity" android:launchMode="singleTask" ...
Intent intent = new Intent(this, MainActivity.class); startActivity(intent);
@Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); finish(); }
public class ActivityCollector { public static List<Activity> activities = new ArrayList<Activity>(); public static void addActivity(Activity activity) { activities.add(activity); } public static void removeActivity(Activity activity) { activities.remove(activity); } public static void finishAll() { for (Activity activity : activities) { if (!activity.isFinishing()) { activity.finish(); } } } }
public class BaseActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d("BaseActivity", getClass().getSimpleName()); ActivityCollector.addActivity(this); } @Override protected void onDestroy() { super.onDestroy(); ActivityCollector.removeActivity(this); } }
ActivityCollector.finishAll();
,就可以销毁所有Activity,关掉程序。原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。