网站建设方案书怎么写样版,html网址怎么打开,网站建设最新新闻,搜索引擎广告形式有新建项目ActivityLifeCycleTest#xff0c;创建主活动后#xff0c;再新建两个子活动--NormalActivity和DialogActivity。
现在活动及其对应布局文件创建完毕。
编辑normal_layout.xml文件#xff0c;代码如下#xff1a;
?xml version1.0 encoding… 新建项目ActivityLifeCycleTest创建主活动后再新建两个子活动--NormalActivity和DialogActivity。
现在活动及其对应布局文件创建完毕。
编辑normal_layout.xml文件代码如下
?xml version1.0 encodingutf-8?
LinearLayout xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:orientationvertical android:layout_widthmatch_parentandroid:layout_heightmatch_parent TextViewandroid:layout_widthmatch_parentandroid:layout_heightwrap_content android:textThis is a normal activity/
/LinearLayout
只是简单是使用了一个TextView用来显示一行文字。
然后编辑dialog_layout.xml代码如下
?xml version1.0 encodingutf-8?
LinearLayout xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:orientationvertical android:layout_widthmatch_parentandroid:layout_heightmatch_parentTextViewandroid:layout_widthmatch_parentandroid:layout_heightwrap_content android:textThis is a dialog activity/
/LinearLayout从名字上可以看出来这两个子活动一个是普通的活动一个是对话框式的活动。现在我们来修改这个对话框式的活动打开AndroidManifest.xml文件的activity标签并修改。代码如下
activity android:name.DialogActivityandroid:themestyle/Theme.AppCompat.Dialog
/activity
这里是活动的注册码并且只给DialogActivity的代码进行了修改给它使用了android:theme属性这是用来给当前活动指定主题的Android系统内置了很多主题可以选择这里是让DialogActivity使用对话框式的主题。
接下来重新定制主活动的布局将里面的代码替换成如下
LinearLayout xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:orientationverticalandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentButtonandroid:idid/start_normal_activityandroid:layout_widthmatch_parentandroid:layout_heightwrap_content android:text Start NormalActivity/Buttonandroid:idid/start_dialog_activityandroid:layout_widthmatch_parentandroid:layout_heightwrap_content android:text Start DialogActivity/
/LinearLayout只是添加了两个按钮分别对应两个子活动。
最后修改MainActivity中的代码如下所示
package com.example.activitylifecycletest;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity { public static final String TAG MainActivity;//定义当前类名为常量Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button StartNormalActivity (Button) findViewById(R.id.start_normal_activity);Button StartDialogActivity (Button) findViewById(R.id.start_dialog_activity);StartNormalActivity.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View view) {Intent intent new Intent(MainActivity.this,NormalActivity.class);startActivity(intent);}});StartDialogActivity.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View view) {Intent intent new Intent(MainActivity.this,DialogActivity.class);startActivity(intent); }})} Overrideprotected void onStart() {super.onStart();Log.d(TAG,onStart);}Overrideprotected void onResume() {super.onResume();Log.d(TAG,onResume);}Overrideprotected void onPause() {super.onPause();Log.d(TAG,onPause);}Overrideprotected void onStop() {super.onStop();Log.d(TAG,onStop);}Overrideprotected void onDestroy() {super.onDestroy();Log.d(TAG,onDestroy);}
}
在onCreate()方法中我们分别为两个按钮定义了点击事件点击按钮会启动相应的Activity然后会在Activity的7个回调方法中分别打印了一句话这样更好的观察理解活动的生命周期。倘若活动被回收了怎么办
假设有一个活动A在活动A的基础上启动了活动B那么活动A进入了Stop状态这时突然由于系统内存不存将活动A回收了然后用户按下Back键返回活动A会出现什么情况呢还是会正常启动A的只不过并不是执行onReStart()方法而是会执行活动A的onCreate()方法因为活动A在这种情况会被重新创建一次。那么加入活动A本来是存在临时数据和状态的那么重新创建一次什么都不没有显示了这不是令人很难过吗
经查阅文档。Activity中还提供了一个onSaveInstanceState()回调方法这个方法可以保证活动在回收之前一定被调用因此这个方法来解决活动被回收时临时数据得不到保存的问题。
onSaveInstanceState()方法会携带一个Bundle类型的参数Bundle提供了一系列的方法用于保存数据例如可以使用putString()来保存字符串使用putInt()保存整型每个保存方法有两个参数一个是键用于后面从Bundle中取值第二个参数是真正要保存的内容。这么看来键和保存的内容是一一对应的吧。
在MainActivity中添加如下代码
Overrideprotected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);String tempData Something you just typed;outState.putString(data_key,tempData);}我们是在MainActivity文件中重写了这个方法。那么数据是保存好了但是我们应该在哪里恢复呢我们之前一直使用的onCreate()方法其实也有一个Bundle类型的参数。这个参数一般情况是null但是如果在活动被回收之前有通过onSaveInstanceState()方法来保存数据的话这个参数就会带有之前所保存的全部数据我们只需要修改MainActivity的onCreate()方法代码如下protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.d(TAG,onCreate);setContentView(R.layout.activity_main);if(savedInstanceState !null){String tempData savedInstanceState.getString(data_key);Log.d(TAG,tempData);}Button StartNormalActivity (Button) findViewById(R.id.start_normal_activity);Button StartDialogActivity (Button) findViewById(R.id.start_dialog_activity);StartNormalActivity.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View view) {Intent intent new Intent(MainActivity.this,NormalActivity.class);startActivity(intent);}});StartDialogActivity.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View view) {Intent intent new Intent(MainActivity.this,DialogActivity.class);startActivity(intent);}});}
Intent还可以结合Bundle一起用于传输数据首先可以把需要传递的数据都保存在Bundle对象中然后再将Buddle对象存放在Intent里。到了目标活动之后先从Intent中取出Bundle在从Bundle中一一取出数据。