android从放弃到坚持放弃第二课下.docx
《android从放弃到坚持放弃第二课下.docx》由会员分享,可在线阅读,更多相关《android从放弃到坚持放弃第二课下.docx(17页珍藏版)》请在冰豆网上搜索。
android从放弃到坚持放弃第二课下
android从放弃到坚持放弃第二课(下)
写app必须掌握活动的生命周期。
[活动的生命周期]
[返回栈]
Android每次启动的活动会覆盖在原活动之上,然后点击Back键会销毁最上层的活动。
是使用Task来管理活动,一个任务就是一组存放在栈里面的活动的集合,这个栈被称为返回栈。
每当我们按下这个Back或者调用finish()方法去销毁一个活动,处于栈顶的活动就会出栈。
[活动状态]
运行状态
一个活动位于返回栈栈顶的时候,就是运行状态,也是系统最不愿意回收的状态的活动。
暂停状态
当一个活动不再处于栈顶,但还是可见时,就进入了暂停状态。
如对话框。
只有在内存极低的情况下,系统才会回收这个活动
停止状态
当一个活动不处于栈顶且不可见时就进入了停止状态。
系统有可能会回收。
销毁状态
当一个活动从返回栈中移除后就变成了销毁状态。
系统回收这种状态的活动,保证内存充足。
[活动的生存期]
Activity类中定义了7个回调方法,覆盖了活动生命周期的每一个环节。
都是从加载资源到释放资源,从而合理的管理资源。
[体验活动的生命周期]
既然是体验,我们还是重新newproject吧,这次创建子活动勾选LauncherActivity,创建NormalActivity,DialogActivity.
编辑activity_normal.xml:
android:
orientation="vertical"
layout_width="match_parent"
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";@OverrideprotectedvoidonCreate(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(){@OverridepublicvoidonClick(Viewv){Intentintent=newIntent(MainActivity.this,NormalActivity.class);startActivity(intent);}});startDialogActivity.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){Intentintent=newIntent(MainActivity.this,DialogActivity.class);startActivity(intent);}});}@OverrideprotectedvoidonStart(){super.onStart();Log.d(TAG,"onStart");}@OverrideprotectedvoidonResume(){super.onResume();Log.d(TAG,"onResume");}@OverrideprotectedvoidonPause(){super.onPause();Log.d(TAG,"onPause");}@OverrideprotectedvoidonStop(){super.onStop();Log.d(TAG,"onStop");}@OverrideprotectedvoidonDestroy(){super.onDestroy();Log.d(TAG,"onDestory");}@OverrideprotectedvoidonRestart(){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中一一取出数据。[活动的启动模式]启动模式分为四种:standardsingleTopsingleTasksingleInstance可以在androidManifest.xml中通过给标签中指定android:launchMode属性来选择。1.standard活动默认的启动模式。因此,我们之前所使用过的都是standard模式。每当启动一个新的活动,它就会在返回栈中入栈,并处于栈顶的位置。对于standard模式下的活动,系统不会在乎这个活动是否已在返回栈中存在,每次启动都会创建该活动的一个新的实例。打开之前的ActivityTest项目。修改FirstActivity:publicclassFirstActivityextendsAppCompatActivity{privatestaticfinalStringTag="FirstActivity";@OverrideprotectedvoidonCreate(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(){@OverridepublicvoidonClick(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(){@OverridepublicvoidonClick(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(){@OverridepublicvoidonClick(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(){@OverridepublicvoidonClick(Viewv){IntentintentToBaidu=newIntent(Intent.ACTION_VIEW);intentToBaidu.setData(Uri.parse("startActivity(intentToBaidu);}});}@OverridepublicbooleanonOptionsItemSelected(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;}@OverridepublicbooleanonCreateOptionsMenu(Menumenu){getMenuInflater().inflate(R.menu.main,menu);returntrue;}@OverrideprotectedvoidonActivityResult(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@42900c5003-3012:38:59.4857273-7273/com.example.wrjjrw.activitytestD/FirstActivity:com.example.wrjjrw.activitytest.FirstActivity@4293a0c8发现如果打开它自己三下,也就需要2.singleTop似乎standard不是很合理。singleTop在启动活动时如果发现返回栈的栈顶已是该活动,则认为可以直接使用它,不会再创建新的活动实例。修改AndroidManifest.xmlandroid: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.singleTasksingleTask模式可以解决上述问题。每次启动活动时,系统会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动上面的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。修改FirstActivity:@OverrideprotectedvoidonRestart(){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();//}@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_second);Buttonbutton3=(Button)findViewById(R.id.button_3);button3.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){IntentintentFirst=newIntent(SecondActivity.this,FirstActivity.class);startActivity(intentFirst);}});ButtonbuttonFinishSecond=(Button)findViewById(R.id.button_finish);buttonFinishSecond.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){Intentintent=newIntent();intent.putExtra("data_return","byebyehuchi");setResult(RESULT_OK,intent);finish();}});Intentintent=getIntent();Stringdata=intent.getStringExtra("extra_data");Log.d("SecondActivity",data);}@OverrideprotectedvoidonDestroy(){super.onDestroy();Log.d(Tag,"onDestroy");}}跑路。观察logcat4.singleInstance最特殊最复杂的模式。会启动一个新的返回栈来管理这个活动(如果singleTask模式下指定了不同的taskAffinity).singleInstance可以实现其他程序和我们的程序共享一个活动的实例。在这种模式下会有一个单独的返回栈来管理这个活动,不管是哪个应用程序来访这个活动,都公用同一个返回栈。实践出真
layout_height="wrap_content"
text="Thisisnormalactivity"
/>
编辑activity_dialog.xml:
layout_height="match_parent"
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";@OverrideprotectedvoidonCreate(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(){@OverridepublicvoidonClick(Viewv){Intentintent=newIntent(MainActivity.this,NormalActivity.class);startActivity(intent);}});startDialogActivity.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){Intentintent=newIntent(MainActivity.this,DialogActivity.class);startActivity(intent);}});}@OverrideprotectedvoidonStart(){super.onStart();Log.d(TAG,"onStart");}@OverrideprotectedvoidonResume(){super.onResume();Log.d(TAG,"onResume");}@OverrideprotectedvoidonPause(){super.onPause();Log.d(TAG,"onPause");}@OverrideprotectedvoidonStop(){super.onStop();Log.d(TAG,"onStop");}@OverrideprotectedvoidonDestroy(){super.onDestroy();Log.d(TAG,"onDestory");}@OverrideprotectedvoidonRestart(){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中一一取出数据。[活动的启动模式]启动模式分为四种:standardsingleTopsingleTasksingleInstance可以在androidManifest.xml中通过给标签中指定android:launchMode属性来选择。1.standard活动默认的启动模式。因此,我们之前所使用过的都是standard模式。每当启动一个新的活动,它就会在返回栈中入栈,并处于栈顶的位置。对于standard模式下的活动,系统不会在乎这个活动是否已在返回栈中存在,每次启动都会创建该活动的一个新的实例。打开之前的ActivityTest项目。修改FirstActivity:publicclassFirstActivityextendsAppCompatActivity{privatestaticfinalStringTag="FirstActivity";@OverrideprotectedvoidonCreate(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(){@OverridepublicvoidonClick(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(){@OverridepublicvoidonClick(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(){@OverridepublicvoidonClick(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(){@OverridepublicvoidonClick(Viewv){IntentintentToBaidu=newIntent(Intent.ACTION_VIEW);intentToBaidu.setData(Uri.parse("startActivity(intentToBaidu);}});}@OverridepublicbooleanonOptionsItemSelected(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;}@OverridepublicbooleanonCreateOptionsMenu(Menumenu){getMenuInflater().inflate(R.menu.main,menu);returntrue;}@OverrideprotectedvoidonActivityResult(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@42900c5003-3012:38:59.4857273-7273/com.example.wrjjrw.activitytestD/FirstActivity:com.example.wrjjrw.activitytest.FirstActivity@4293a0c8发现如果打开它自己三下,也就需要2.singleTop似乎standard不是很合理。singleTop在启动活动时如果发现返回栈的栈顶已是该活动,则认为可以直接使用它,不会再创建新的活动实例。修改AndroidManifest.xmlandroid: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.singleTasksingleTask模式可以解决上述问题。每次启动活动时,系统会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动上面的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。修改FirstActivity:@OverrideprotectedvoidonRestart(){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();//}@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_second);Buttonbutton3=(Button)findViewById(R.id.button_3);button3.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){IntentintentFirst=newIntent(SecondActivity.this,FirstActivity.class);startActivity(intentFirst);}});ButtonbuttonFinishSecond=(Button)findViewById(R.id.button_finish);buttonFinishSecond.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){Intentintent=newIntent();intent.putExtra("data_return","byebyehuchi");setResult(RESULT_OK,intent);finish();}});Intentintent=getIntent();Stringdata=intent.getStringExtra("extra_data");Log.d("SecondActivity",data);}@OverrideprotectedvoidonDestroy(){super.onDestroy();Log.d(Tag,"onDestroy");}}跑路。观察logcat4.singleInstance最特殊最复杂的模式。会启动一个新的返回栈来管理这个活动(如果singleTask模式下指定了不同的taskAffinity).singleInstance可以实现其他程序和我们的程序共享一个活动的实例。在这种模式下会有一个单独的返回栈来管理这个活动,不管是哪个应用程序来访这个活动,都公用同一个返回栈。实践出真
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";@OverrideprotectedvoidonCreate(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(){@OverridepublicvoidonClick(Viewv){Intentintent=newIntent(MainActivity.this,NormalActivity.class);startActivity(intent);}});startDialogActivity.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){Intentintent=newIntent(MainActivity.this,DialogActivity.class);startActivity(intent);}});}@OverrideprotectedvoidonStart(){super.onStart();Log.d(TAG,"onStart");}@OverrideprotectedvoidonResume(){super.onResume();Log.d(TAG,"onResume");}@OverrideprotectedvoidonPause(){super.onPause();Log.d(TAG,"onPause");}@OverrideprotectedvoidonStop(){super.onStop();Log.d(TAG,"onStop");}@OverrideprotectedvoidonDestroy(){super.onDestroy();Log.d(TAG,"onDestory");}@OverrideprotectedvoidonRestart(){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中一一取出数据。[活动的启动模式]启动模式分为四种:standardsingleTopsingleTasksingleInstance可以在androidManifest.xml中通过给标签中指定android:launchMode属性来选择。1.standard活动默认的启动模式。因此,我们之前所使用过的都是standard模式。每当启动一个新的活动,它就会在返回栈中入栈,并处于栈顶的位置。对于standard模式下的活动,系统不会在乎这个活动是否已在返回栈中存在,每次启动都会创建该活动的一个新的实例。打开之前的ActivityTest项目。修改FirstActivity:publicclassFirstActivityextendsAppCompatActivity{privatestaticfinalStringTag="FirstActivity";@OverrideprotectedvoidonCreate(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(){@OverridepublicvoidonClick(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(){@OverridepublicvoidonClick(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(){@OverridepublicvoidonClick(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(){@OverridepublicvoidonClick(Viewv){IntentintentToBaidu=newIntent(Intent.ACTION_VIEW);intentToBaidu.setData(Uri.parse("startActivity(intentToBaidu);}});}@OverridepublicbooleanonOptionsItemSelected(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;}@OverridepublicbooleanonCreateOptionsMenu(Menumenu){getMenuInflater().inflate(R.menu.main,menu);returntrue;}@OverrideprotectedvoidonActivityResult(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@42900c5003-3012:38:59.4857273-7273/com.example.wrjjrw.activitytestD/FirstActivity:com.example.wrjjrw.activitytest.FirstActivity@4293a0c8发现如果打开它自己三下,也就需要2.singleTop似乎standard不是很合理。singleTop在启动活动时如果发现返回栈的栈顶已是该活动,则认为可以直接使用它,不会再创建新的活动实例。修改AndroidManifest.xmlandroid: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.singleTasksingleTask模式可以解决上述问题。每次启动活动时,系统会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动上面的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。修改FirstActivity:@OverrideprotectedvoidonRestart(){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();//}@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_second);Buttonbutton3=(Button)findViewById(R.id.button_3);button3.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){IntentintentFirst=newIntent(SecondActivity.this,FirstActivity.class);startActivity(intentFirst);}});ButtonbuttonFinishSecond=(Button)findViewById(R.id.button_finish);buttonFinishSecond.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){Intentintent=newIntent();intent.putExtra("data_return","byebyehuchi");setResult(RESULT_OK,intent);finish();}});Intentintent=getIntent();Stringdata=intent.getStringExtra("extra_data");Log.d("SecondActivity",data);}@OverrideprotectedvoidonDestroy(){super.onDestroy();Log.d(Tag,"onDestroy");}}跑路。观察logcat4.singleInstance最特殊最复杂的模式。会启动一个新的返回栈来管理这个活动(如果singleTask模式下指定了不同的taskAffinity).singleInstance可以实现其他程序和我们的程序共享一个活动的实例。在这种模式下会有一个单独的返回栈来管理这个活动,不管是哪个应用程序来访这个活动,都公用同一个返回栈。实践出真
name=".DialogActivity"
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";@OverrideprotectedvoidonCreate(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(){@OverridepublicvoidonClick(Viewv){Intentintent=newIntent(MainActivity.this,NormalActivity.class);startActivity(intent);}});startDialogActivity.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){Intentintent=newIntent(MainActivity.this,DialogActivity.class);startActivity(intent);}});}@OverrideprotectedvoidonStart(){super.onStart();Log.d(TAG,"onStart");}@OverrideprotectedvoidonResume(){super.onResume();Log.d(TAG,"onResume");}@OverrideprotectedvoidonPause(){super.onPause();Log.d(TAG,"onPause");}@OverrideprotectedvoidonStop(){super.onStop();Log.d(TAG,"onStop");}@OverrideprotectedvoidonDestroy(){super.onDestroy();Log.d(TAG,"onDestory");}@OverrideprotectedvoidonRestart(){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中一一取出数据。[活动的启动模式]启动模式分为四种:standardsingleTopsingleTasksingleInstance可以在androidManifest.xml中通过给标签中指定android:launchMode属性来选择。1.standard活动默认的启动模式。因此,我们之前所使用过的都是standard模式。每当启动一个新的活动,它就会在返回栈中入栈,并处于栈顶的位置。对于standard模式下的活动,系统不会在乎这个活动是否已在返回栈中存在,每次启动都会创建该活动的一个新的实例。打开之前的ActivityTest项目。修改FirstActivity:publicclassFirstActivityextendsAppCompatActivity{privatestaticfinalStringTag="FirstActivity";@OverrideprotectedvoidonCreate(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(){@OverridepublicvoidonClick(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(){@OverridepublicvoidonClick(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(){@OverridepublicvoidonClick(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(){@OverridepublicvoidonClick(Viewv){IntentintentToBaidu=newIntent(Intent.ACTION_VIEW);intentToBaidu.setData(Uri.parse("startActivity(intentToBaidu);}});}@OverridepublicbooleanonOptionsItemSelected(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;}@OverridepublicbooleanonCreateOptionsMenu(Menumenu){getMenuInflater().inflate(R.menu.main,menu);returntrue;}@OverrideprotectedvoidonActivityResult(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@42900c5003-3012:38:59.4857273-7273/com.example.wrjjrw.activitytestD/FirstActivity:com.example.wrjjrw.activitytest.FirstActivity@4293a0c8发现如果打开它自己三下,也就需要2.singleTop似乎standard不是很合理。singleTop在启动活动时如果发现返回栈的栈顶已是该活动,则认为可以直接使用它,不会再创建新的活动实例。修改AndroidManifest.xmlandroid: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.singleTasksingleTask模式可以解决上述问题。每次启动活动时,系统会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动上面的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。修改FirstActivity:@OverrideprotectedvoidonRestart(){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();//}@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_second);Buttonbutton3=(Button)findViewById(R.id.button_3);button3.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){IntentintentFirst=newIntent(SecondActivity.this,FirstActivity.class);startActivity(intentFirst);}});ButtonbuttonFinishSecond=(Button)findViewById(R.id.button_finish);buttonFinishSecond.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){Intentintent=newIntent();intent.putExtra("data_return","byebyehuchi");setResult(RESULT_OK,intent);finish();}});Intentintent=getIntent();Stringdata=intent.getStringExtra("extra_data");Log.d("SecondActivity",data);}@OverrideprotectedvoidonDestroy(){super.onDestroy();Log.d(Tag,"onDestroy");}}跑路。观察logcat4.singleInstance最特殊最复杂的模式。会启动一个新的返回栈来管理这个活动(如果singleTask模式下指定了不同的taskAffinity).singleInstance可以实现其他程序和我们的程序共享一个活动的实例。在这种模式下会有一个单独的返回栈来管理这个活动,不管是哪个应用程序来访这个活动,都公用同一个返回栈。实践出真
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";@OverrideprotectedvoidonCreate(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(){@OverridepublicvoidonClick(Viewv){Intentintent=newIntent(MainActivity.this,NormalActivity.class);startActivity(intent);}});startDialogActivity.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){Intentintent=newIntent(MainActivity.this,DialogActivity.class);startActivity(intent);}});}@OverrideprotectedvoidonStart(){super.onStart();Log.d(TAG,"onStart");}@OverrideprotectedvoidonResume(){super.onResume();Log.d(TAG,"onResume");}@OverrideprotectedvoidonPause(){super.onPause();Log.d(TAG,"onPause");}@OverrideprotectedvoidonStop(){super.onStop();Log.d(TAG,"onStop");}@OverrideprotectedvoidonDestroy(){super.onDestroy();Log.d(TAG,"onDestory");}@OverrideprotectedvoidonRestart(){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中一一取出数据。[活动的启动模式]启动模式分为四种:standardsingleTopsingleTasksingleInstance可以在androidManifest.xml中通过给标签中指定android:launchMode属性来选择。1.standard活动默认的启动模式。因此,我们之前所使用过的都是standard模式。每当启动一个新的活动,它就会在返回栈中入栈,并处于栈顶的位置。对于standard模式下的活动,系统不会在乎这个活动是否已在返回栈中存在,每次启动都会创建该活动的一个新的实例。打开之前的ActivityTest项目。修改FirstActivity:publicclassFirstActivityextendsAppCompatActivity{privatestaticfinalStringTag="FirstActivity";@OverrideprotectedvoidonCreate(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(){@OverridepublicvoidonClick(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(){@OverridepublicvoidonClick(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(){@OverridepublicvoidonClick(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(){@OverridepublicvoidonClick(Viewv){IntentintentToBaidu=newIntent(Intent.ACTION_VIEW);intentToBaidu.setData(Uri.parse("startActivity(intentToBaidu);}});}@OverridepublicbooleanonOptionsItemSelected(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;}@OverridepublicbooleanonCreateOptionsMenu(Menumenu){getMenuInflater().inflate(R.menu.main,menu);returntrue;}@OverrideprotectedvoidonActivityResult(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@42900c5003-3012:38:59.4857273-7273/com.example.wrjjrw.activitytestD/FirstActivity:com.example.wrjjrw.activitytest.FirstActivity@4293a0c8发现如果打开它自己三下,也就需要2.singleTop似乎standard不是很合理。singleTop在启动活动时如果发现返回栈的栈顶已是该活动,则认为可以直接使用它,不会再创建新的活动实例。修改AndroidManifest.xmlandroid: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.singleTasksingleTask模式可以解决上述问题。每次启动活动时,系统会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动上面的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。修改FirstActivity:@OverrideprotectedvoidonRestart(){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();//}@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_second);Buttonbutton3=(Button)findViewById(R.id.button_3);button3.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){IntentintentFirst=newIntent(SecondActivity.this,FirstActivity.class);startActivity(intentFirst);}});ButtonbuttonFinishSecond=(Button)findViewById(R.id.button_finish);buttonFinishSecond.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){Intentintent=newIntent();intent.putExtra("data_return","byebyehuchi");setResult(RESULT_OK,intent);finish();}});Intentintent=getIntent();Stringdata=intent.getStringExtra("extra_data");Log.d("SecondActivity",data);}@OverrideprotectedvoidonDestroy(){super.onDestroy();Log.d(Tag,"onDestroy");}}跑路。观察logcat4.singleInstance最特殊最复杂的模式。会启动一个新的返回栈来管理这个活动(如果singleTask模式下指定了不同的taskAffinity).singleInstance可以实现其他程序和我们的程序共享一个活动的实例。在这种模式下会有一个单独的返回栈来管理这个活动,不管是哪个应用程序来访这个活动,都公用同一个返回栈。实践出真
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";@OverrideprotectedvoidonCreate(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(){@OverridepublicvoidonClick(Viewv){Intentintent=newIntent(MainActivity.this,NormalActivity.class);startActivity(intent);}});startDialogActivity.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){Intentintent=newIntent(MainActivity.this,DialogActivity.class);startActivity(intent);}});}@OverrideprotectedvoidonStart(){super.onStart();Log.d(TAG,"onStart");}@OverrideprotectedvoidonResume(){super.onResume();Log.d(TAG,"onResume");}@OverrideprotectedvoidonPause(){super.onPause();Log.d(TAG,"onPause");}@OverrideprotectedvoidonStop(){super.onStop();Log.d(TAG,"onStop");}@OverrideprotectedvoidonDestroy(){super.onDestroy();Log.d(TAG,"onDestory");}@OverrideprotectedvoidonRestart(){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中一一取出数据。[活动的启动模式]启动模式分为四种:standardsingleTopsingleTasksingleInstance可以在androidManifest.xml中通过给标签中指定android:launchMode属性来选择。1.standard活动默认的启动模式。因此,我们之前所使用过的都是standard模式。每当启动一个新的活动,它就会在返回栈中入栈,并处于栈顶的位置。对于standard模式下的活动,系统不会在乎这个活动是否已在返回栈中存在,每次启动都会创建该活动的一个新的实例。打开之前的ActivityTest项目。修改FirstActivity:publicclassFirstActivityextendsAppCompatActivity{privatestaticfinalStringTag="FirstActivity";@OverrideprotectedvoidonCreate(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(){@OverridepublicvoidonClick(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(){@OverridepublicvoidonClick(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(){@OverridepublicvoidonClick(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(){@OverridepublicvoidonClick(Viewv){IntentintentToBaidu=newIntent(Intent.ACTION_VIEW);intentToBaidu.setData(Uri.parse("startActivity(intentToBaidu);}});}@OverridepublicbooleanonOptionsItemSelected(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;}@OverridepublicbooleanonCreateOptionsMenu(Menumenu){getMenuInflater().inflate(R.menu.main,menu);returntrue;}@OverrideprotectedvoidonActivityResult(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@42900c5003-3012:38:59.4857273-7273/com.example.wrjjrw.activitytestD/FirstActivity:com.example.wrjjrw.activitytest.FirstActivity@4293a0c8发现如果打开它自己三下,也就需要2.singleTop似乎standard不是很合理。singleTop在启动活动时如果发现返回栈的栈顶已是该活动,则认为可以直接使用它,不会再创建新的活动实例。修改AndroidManifest.xmlandroid: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.singleTasksingleTask模式可以解决上述问题。每次启动活动时,系统会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动上面的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。修改FirstActivity:@OverrideprotectedvoidonRestart(){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();//}@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_second);Buttonbutton3=(Button)findViewById(R.id.button_3);button3.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){IntentintentFirst=newIntent(SecondActivity.this,FirstActivity.class);startActivity(intentFirst);}});ButtonbuttonFinishSecond=(Button)findViewById(R.id.button_finish);buttonFinishSecond.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){Intentintent=newIntent();intent.putExtra("data_return","byebyehuchi");setResult(RESULT_OK,intent);finish();}});Intentintent=getIntent();Stringdata=intent.getStringExtra("extra_data");Log.d("SecondActivity",data);}@OverrideprotectedvoidonDestroy(){super.onDestroy();Log.d(Tag,"onDestroy");}}跑路。观察logcat4.singleInstance最特殊最复杂的模式。会启动一个新的返回栈来管理这个活动(如果singleTask模式下指定了不同的taskAffinity).singleInstance可以实现其他程序和我们的程序共享一个活动的实例。在这种模式下会有一个单独的返回栈来管理这个活动,不管是哪个应用程序来访这个活动,都公用同一个返回栈。实践出真
id="@+id/start_normal_activity"
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";@OverrideprotectedvoidonCreate(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(){@OverridepublicvoidonClick(Viewv){Intentintent=newIntent(MainActivity.this,NormalActivity.class);startActivity(intent);}});startDialogActivity.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){Intentintent=newIntent(MainActivity.this,DialogActivity.class);startActivity(intent);}});}@OverrideprotectedvoidonStart(){super.onStart();Log.d(TAG,"onStart");}@OverrideprotectedvoidonResume(){super.onResume();Log.d(TAG,"onResume");}@OverrideprotectedvoidonPause(){super.onPause();Log.d(TAG,"onPause");}@OverrideprotectedvoidonStop(){super.onStop();Log.d(TAG,"onStop");}@OverrideprotectedvoidonDestroy(){super.onDestroy();Log.d(TAG,"onDestory");}@OverrideprotectedvoidonRestart(){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中一一取出数据。[活动的启动模式]启动模式分为四种:standardsingleTopsingleTasksingleInstance可以在androidManifest.xml中通过给标签中指定android:launchMode属性来选择。1.standard活动默认的启动模式。因此,我们之前所使用过的都是standard模式。每当启动一个新的活动,它就会在返回栈中入栈,并处于栈顶的位置。对于standard模式下的活动,系统不会在乎这个活动是否已在返回栈中存在,每次启动都会创建该活动的一个新的实例。打开之前的ActivityTest项目。修改FirstActivity:publicclassFirstActivityextendsAppCompatActivity{privatestaticfinalStringTag="FirstActivity";@OverrideprotectedvoidonCreate(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(){@OverridepublicvoidonClick(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(){@OverridepublicvoidonClick(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(){@OverridepublicvoidonClick(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(){@OverridepublicvoidonClick(Viewv){IntentintentToBaidu=newIntent(Intent.ACTION_VIEW);intentToBaidu.setData(Uri.parse("startActivity(intentToBaidu);}});}@OverridepublicbooleanonOptionsItemSelected(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;}@OverridepublicbooleanonCreateOptionsMenu(Menumenu){getMenuInflater().inflate(R.menu.main,menu);returntrue;}@OverrideprotectedvoidonActivityResult(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@42900c5003-3012:38:59.4857273-7273/com.example.wrjjrw.activitytestD/FirstActivity:com.example.wrjjrw.activitytest.FirstActivity@4293a0c8发现如果打开它自己三下,也就需要2.singleTop似乎standard不是很合理。singleTop在启动活动时如果发现返回栈的栈顶已是该活动,则认为可以直接使用它,不会再创建新的活动实例。修改AndroidManifest.xmlandroid: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.singleTasksingleTask模式可以解决上述问题。每次启动活动时,系统会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动上面的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。修改FirstActivity:@OverrideprotectedvoidonRestart(){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();//}@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_second);Buttonbutton3=(Button)findViewById(R.id.button_3);button3.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){IntentintentFirst=newIntent(SecondActivity.this,FirstActivity.class);startActivity(intentFirst);}});ButtonbuttonFinishSecond=(Button)findViewById(R.id.button_finish);buttonFinishSecond.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){Intentintent=newIntent();intent.putExtra("data_return","byebyehuchi");setResult(RESULT_OK,intent);finish();}});Intentintent=getIntent();Stringdata=intent.getStringExtra("extra_data");Log.d("SecondActivity",data);}@OverrideprotectedvoidonDestroy(){super.onDestroy();Log.d(Tag,"onDestroy");}}跑路。观察logcat4.singleInstance最特殊最复杂的模式。会启动一个新的返回栈来管理这个活动(如果singleTask模式下指定了不同的taskAffinity).singleInstance可以实现其他程序和我们的程序共享一个活动的实例。在这种模式下会有一个单独的返回栈来管理这个活动,不管是哪个应用程序来访这个活动,都公用同一个返回栈。实践出真
id="@+id/start_dialog_activity"
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(){
publicvoidonClick(Viewv){
Intentintent=newIntent(MainActivity.this,NormalActivity.class);
startActivity(intent);
}
});
startDialogActivity.setOnClickListener(newView.OnClickListener(){
Intentintent=newIntent(MainActivity.this,DialogActivity.class);
protectedvoidonStart(){
super.onStart();
Log.d(TAG,"onStart");
protectedvoidonResume(){
super.onResume();
Log.d(TAG,"onResume");
protectedvoidonPause(){
super.onPause();
Log.d(TAG,"onPause");
protectedvoidonStop(){
super.onStop();
Log.d(TAG,"onStop");
protectedvoidonDestroy(){
super.onDestroy();
Log.d(TAG,"onDestory");
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类型的参数,就靠它
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";
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(){
Toast.makeText(FirstActivity.this,"Youclickme",Toast.LENGTH_SHORT).show();
Intentintent=newIntent(FirstActivity.this,FirstActivity.class);
Buttonbutton2=(Button)findViewById(R.id.button_2);
button2.setOnClickListener(newView.OnClickListener(){
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(){
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(){
IntentintentToBaidu=newIntent(Intent.ACTION_VIEW);
intentToBaidu.setData(Uri.parse("
startActivity(intentToBaidu);
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();
caseR.id.huchi_item:
Toast.makeText(this,"Ilovehuchi,too",Toast.LENGTH_LONG).show();
default:
returntrue;
publicbooleanonCreateOptionsMenu(Menumenu){
getMenuInflater().inflate(R.menu.main,menu);
protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){
switch(requestCode){
case1:
if(resultCode==RESULT_OK){
StringreturnedData=data.getStringExtra("data_return");
Log.d("FirstActivity",returnedData);
我们看到他可以启动他自己,跑路。
03-3012:
38:
54.4247273-7273/com.example.wrjjrw.activitytestD/FirstActivity:
com.example.wrjjrw.activitytest.FirstActivity@42900c50
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"/>
name=".FirstActivity"
launchMode="singleTop"
label="Thisishuchi'sFirstActivity">
name="android.intent.action.MAIN"/>name="android.intent.category.LAUNCHER"/>
发现无论点多少次logcat都没有打印信息了。
不过在FirstActivity并未处于栈顶时,这时再启动FirstActivity,还是会创建新的实例的。
我们发现在FirstActivity和SecondActivity两个活动中跳来跳去可以在logcat看到打印的消息。
3.singleTask
singleTask模式可以解决上述问题。
每次启动活动时,系统会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动上面的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。
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();
//}
setContentView(R.layout.activity_second);
Buttonbutton3=(Button)findViewById(R.id.button_3);
button3.setOnClickListener(newView.OnClickListener(){
IntentintentFirst=newIntent(SecondActivity.this,FirstActivity.class);
startActivity(intentFirst);
ButtonbuttonFinishSecond=(Button)findViewById(R.id.button_finish);
buttonFinishSecond.setOnClickListener(newView.OnClickListener(){
Intentintent=newIntent();
intent.putExtra("data_return","byebyehuchi");
setResult(RESULT_OK,intent);
finish();
Intentintent=getIntent();
Stringdata=intent.getStringExtra("extra_data");
Log.d("SecondActivity",data);
Log.d(Tag,"onDestroy");
观察logcat
4.singleInstance
最特殊最复杂的模式。
会启动一个新的返回栈来管理这个活动(如果singleTask模式下指定了不同的taskAffinity).singleInstance可以实现其他程序和我们的程序共享一个活动的实例。
在这种模式下会有一个单独的返回栈来管理这个活动,不管是哪个应用程序来访这个活动,都公用同一个返回栈。
实践出真
下载文档到电脑,查找使用更方便
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
copyright@ 2008-2022 冰点文档网站版权所有
经营许可证编号:鄂ICP备2022015515号-1