android从放弃到坚持放弃第二课下.docx

上传人:b****3 文档编号:4940083 上传时间:2022-12-11 格式:DOCX 页数:17 大小:141.62KB
下载 相关 举报
android从放弃到坚持放弃第二课下.docx_第1页
第1页 / 共17页
android从放弃到坚持放弃第二课下.docx_第2页
第2页 / 共17页
android从放弃到坚持放弃第二课下.docx_第3页
第3页 / 共17页
android从放弃到坚持放弃第二课下.docx_第4页
第4页 / 共17页
android从放弃到坚持放弃第二课下.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

android从放弃到坚持放弃第二课下.docx

《android从放弃到坚持放弃第二课下.docx》由会员分享,可在线阅读,更多相关《android从放弃到坚持放弃第二课下.docx(17页珍藏版)》请在冰豆网上搜索。

android从放弃到坚持放弃第二课下.docx

android从放弃到坚持放弃第二课下

android从放弃到坚持放弃第二课(下)

写app必须掌握活动的生命周期。

[活动的生命周期]

[返回栈]

Android每次启动的活动会覆盖在原活动之上,然后点击Back键会销毁最上层的活动。

是使用Task来管理活动,一个任务就是一组存放在栈里面的活动的集合,这个栈被称为返回栈。

每当我们按下这个Back或者调用finish()方法去销毁一个活动,处于栈顶的活动就会出栈。

[活动状态]

运行状态

一个活动位于返回栈栈顶的时候,就是运行状态,也是系统最不愿意回收的状态的活动。

暂停状态

当一个活动不再处于栈顶,但还是可见时,就进入了暂停状态。

如对话框。

只有在内存极低的情况下,系统才会回收这个活动

停止状态

当一个活动不处于栈顶且不可见时就进入了停止状态。

系统有可能会回收。

销毁状态

当一个活动从返回栈中移除后就变成了销毁状态。

系统回收这种状态的活动,保证内存充足。

[活动的生存期]

Activity类中定义了7个回调方法,覆盖了活动生命周期的每一个环节。

都是从加载资源到释放资源,从而合理的管理资源。

[体验活动的生命周期]

既然是体验,我们还是重新newproject吧,这次创建子活动勾选LauncherActivity,创建NormalActivity,DialogActivity.

编辑activity_normal.xml:

android:

orientation="vertical"

android:

layout_width="match_parent"

android:

layout_height="match_parent">

android:

layout_width="match_parent"

android:

layout_height="wrap_content"

android:

text="Thisisnormalactivity"

/>

编辑activity_dialog.xml:

android:

orientation="vertical"

android:

layout_height="match_parent"

android:

layout_width="match_parent">

android:

layout_width="match_parent"

android:

layout_height="wrap_content"

android:

text="Thisisadialogactivity"/>

从名字上可以看出,一个是normal活动,一个是dialog活动(对话框式),但是上面的代码基本一样啊。

我们需要去AndroidManifest.xml中修改:

name=".DialogActivity"

android:

theme="@android:

style/Theme.Dialog">

name="android.intent.action.MAIN"/>

name="android.intent.category.LAUNCHER"/>

我们给它增加了android:

theme的属性。

现在去activity_main.xml中去增加button:

android:

id="@+id/start_normal_activity"

android:

layout_width="match_parent"

android:

layout_height="wrap_content"

android:

text="StartnormalActivity"

/>

android:

id="@+id/start_dialog_activity"

android:

layout_width="match_parent"

android:

layout_height="wrap_content"

android:

text="StartdialogActivity"

/>

最后修改MainActivity中的代码:

publicclassMainActivityextendsAppCompatActivity{

privatestaticfinalStringTAG="MainActivity";

@Override

protectedvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

ButtonstartNormalActivity=(Button)findViewById(R.id.start_normal_activity);

ButtonstartDialogActivity=(Button)findViewById(R.id.start_dialog_activity);

startNormalActivity.setOnClickListener(newView.OnClickListener(){

@Override

publicvoidonClick(Viewv){

Intentintent=newIntent(MainActivity.this,NormalActivity.class);

startActivity(intent);

}

});

startDialogActivity.setOnClickListener(newView.OnClickListener(){

@Override

publicvoidonClick(Viewv){

Intentintent=newIntent(MainActivity.this,DialogActivity.class);

startActivity(intent);

}

});

}

@Override

protectedvoidonStart(){

super.onStart();

Log.d(TAG,"onStart");

}

@Override

protectedvoidonResume(){

super.onResume();

Log.d(TAG,"onResume");

}

@Override

protectedvoidonPause(){

super.onPause();

Log.d(TAG,"onPause");

}

@Override

protectedvoidonStop(){

super.onStop();

Log.d(TAG,"onStop");

}

@Override

protectedvoidonDestroy(){

super.onDestroy();

Log.d(TAG,"onDestory");

}

@Override

protectedvoidonRestart(){

super.onRestart();

Log.d(TAG,"onRestart");

}

}

跑路。

顺带观察一下logcat:

好了,你现在已经体验了一遍完整的生命周期。

我碰到了一个问题,start_dialog_activity这个button运行时除了错,原因是给dialog这个activity的theme里面的属性和DialogActivity继承的一个AppCompatActivity类不兼容,所以只要把继承的AppCompatActivity改为Activity就可以了。

[活动被回收怎么办?

]

当一个活动进入到了停止状态,有可能被系统回收。

这样的话,返回之前的处于停止状态的活动是可以的,只不过不会执行onRestart()方法而是执行的onCreate()方法,也就是说这种情况下,返回之前被回收的活动是会被重新创建的。

不过问题来了,这样临时的数据会丢失,不过问题不大。

Activity中提供了onSaveInstanceState()回调方法,这个方法可以保证在活动被回收之前一定被调用,因此我们可以通过这个方法来保存临时数据。

onSaveInstanceState()方法携带一个Bundle类型的参数,Bundle类提供了一些列方法保存数据,putString)(),putInt()等等,每个保存方法需要传入两个参数,第一个参数是键,用于取值,第二个是真正要保存的数据。

和Intent的差不多。

MainActivity:

protectedvoidonSaveInstanceState(BundleoutState){

super.onSaveInstanceState(outState);

StringtempData="Somethingijusttyped";

outState.putString("data_key",tempData);

}

保存完数据,但是该如何取出数据呢?

onCreate()方法中有一个Bundle类型的参数,就靠它

MainActivity:

Log.d(TAG,"onCreate");

if(savedInstanceState!

=null){

StringtempData=savedInstanceState.getString("data_key");

Log.d(TAG,tempData);

}

而且我们还可以将Bundle对象存放在Intent中,到了目标活动中再取出Bundle,再从Bundle中一一取出数据。

[活动的启动模式]

启动模式分为四种:

standard

singleTop

singleTask

singleInstance

可以在androidManifest.xml中通过给标签中指定android:

launchMode属性来选择。

1.standard

活动默认的启动模式。

因此,我们之前所使用过的都是standard模式。

每当启动一个新的活动,它就会在返回栈中入栈,并处于栈顶的位置。

对于standard模式下的活动,系统不会在乎这个活动是否已在返回栈中存在,每次启动都会创建该活动的一个新的实例。

打开之前的ActivityTest项目。

修改FirstActivity:

publicclassFirstActivityextendsAppCompatActivity{

privatestaticfinalStringTag="FirstActivity";

@Override

protectedvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

requestWindowFeature(Window.FEATURE_NO_TITLE);

setContentView(R.layout.first_layout);

Log.d(Tag,this.toString());

Buttonbutton1=(Button)findViewById(R.id.button_1);

button1.setOnClickListener(newView.OnClickListener(){

@Override

publicvoidonClick(Viewv){

Toast.makeText(FirstActivity.this,"Youclickme",Toast.LENGTH_SHORT).show();

Intentintent=newIntent(FirstActivity.this,FirstActivity.class);

startActivity(intent);

}

});

Buttonbutton2=(Button)findViewById(R.id.button_2);

button2.setOnClickListener(newView.OnClickListener(){

@Override

publicvoidonClick(Viewv){

Stringdata="Hellohuchi";

IntentintentString=newIntent(FirstActivity.this,SecondActivity.class);

intentString.putExtra("extra_data",data);

//startActivity(intentString);

startActivityForResult(intentString,1);

}

});

Buttonbutton4=(Button)findViewById(R.id.button_4);

button4.setOnClickListener(newView.OnClickListener(){

@Override

publicvoidonClick(Viewv){

IntentintentSecond=newIntent("com.example.wrjjrw.activitytest.ACTION_START");

intentSecond.addCategory("com.example.wrjjrw.activitytest.MY_CATEGORY");

intentSecond.putExtra("extra_data","error");

startActivity(intentSecond);

}

});

Buttonbutton5=(Button)findViewById(R.id.button_5);

button5.setOnClickListener(newView.OnClickListener(){

@Override

publicvoidonClick(Viewv){

IntentintentToBaidu=newIntent(Intent.ACTION_VIEW);

intentToBaidu.setData(Uri.parse("

startActivity(intentToBaidu);

}

});

}

@Override

publicbooleanonOptionsItemSelected(MenuItemitem){

switch(item.getItemId()){

caseR.id.add_item:

Toast.makeText(this,"YouclickedAdd",Toast.LENGTH_SHORT).show();

break;

caseR.id.remove_item:

Toast.makeText(this,"YouclickedRemove",Toast.LENGTH_SHORT).show();

break;

caseR.id.huchi_item:

Toast.makeText(this,"Ilovehuchi,too",Toast.LENGTH_LONG).show();

break;

default:

}

returntrue;

}

@Override

publicbooleanonCreateOptionsMenu(Menumenu){

getMenuInflater().inflate(R.menu.main,menu);

returntrue;

}

@Override

protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){

switch(requestCode){

case1:

if(resultCode==RESULT_OK){

StringreturnedData=data.getStringExtra("data_return");

Log.d("FirstActivity",returnedData);

}

break;

default:

}

}

}

我们看到他可以启动他自己,跑路。

03-3012:

38:

54.4247273-7273/com.example.wrjjrw.activitytestD/FirstActivity:

com.example.wrjjrw.activitytest.FirstActivity@42900c50

03-3012:

38:

59.4857273-7273/com.example.wrjjrw.activitytestD/FirstActivity:

com.example.wrjjrw.activitytest.FirstActivity@4293a0c8

发现如果打开它自己三下,也就需要

2.singleTop

似乎standard不是很合理。

singleTop在启动活动时如果发现返回栈的栈顶已是该活动,则认为可以直接使用它,不会再创建新的活动实例。

修改AndroidManifest.xml

android:

name=".FirstActivity"

android:

launchMode="singleTop"

android:

label="Thisishuchi'sFirstActivity">

name="android.intent.action.MAIN"/>

name="android.intent.category.LAUNCHER"/>

发现无论点多少次logcat都没有打印信息了。

不过在FirstActivity并未处于栈顶时,这时再启动FirstActivity,还是会创建新的实例的。

我们发现在FirstActivity和SecondActivity两个活动中跳来跳去可以在logcat看到打印的消息。

3.singleTask

singleTask模式可以解决上述问题。

每次启动活动时,系统会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动上面的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。

修改FirstActivity:

@Override

protectedvoidonRestart(){

super.onRestart();

Log.d(Tag,"onRestart");

}

修改SecondActivity,添加onDestroy():

publicclassSecondActivityextendsAppCompatActivity{

privatestaticfinalStringTag="SecondActivity";

//@Oride

//publicvoidonBackPressed(){

//Intentintent=newIntent();

//intent.putExtra("data_return","back_to_firstActivity");

//setResult(RESULT_OK,intent);

//finish();

//}

@Override

protectedvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_second);

Buttonbutton3=(Button)findViewById(R.id.button_3);

button3.setOnClickListener(newView.OnClickListener(){

@Override

publicvoidonClick(Viewv){

IntentintentFirst=newIntent(SecondActivity.this,FirstActivity.class);

startActivity(intentFirst);

}

});

ButtonbuttonFinishSecond=(Button)findViewById(R.id.button_finish);

buttonFinishSecond.setOnClickListener(newView.OnClickListener(){

@Override

publicvoidonClick(Viewv){

Intentintent=newIntent();

intent.putExtra("data_return","byebyehuchi");

setResult(RESULT_OK,intent);

finish();

}

});

Intentintent=getIntent();

Stringdata=intent.getStringExtra("extra_data");

Log.d("SecondActivity",data);

}

@Override

protectedvoidonDestroy(){

super.onDestroy();

Log.d(Tag,"onDestroy");

}

}

跑路。

观察logcat

4.singleInstance

最特殊最复杂的模式。

会启动一个新的返回栈来管理这个活动(如果singleTask模式下指定了不同的taskAffinity).singleInstance可以实现其他程序和我们的程序共享一个活动的实例。

在这种模式下会有一个单独的返回栈来管理这个活动,不管是哪个应用程序来访这个活动,都公用同一个返回栈。

实践出真

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1