android从放弃到坚持放弃第二课下Word文档下载推荐.docx
- 文档编号:17893470
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:17
- 大小:141.62KB
android从放弃到坚持放弃第二课下Word文档下载推荐.docx
《android从放弃到坚持放弃第二课下Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《android从放弃到坚持放弃第二课下Word文档下载推荐.docx(17页珍藏版)》请在冰豆网上搜索。
orientation="
vertical"
android:
layout_width="
match_parent"
layout_height="
>
<
TextView
wrap_content"
text="
Thisisnormalactivity"
/>
<
/LinearLayout>
编辑activity_dialog.xml:
>
text="
Thisisadialogactivity"
/>
从名字上可以看出,一个是normal活动,一个是dialog活动(对话框式),但是上面的代码基本一样啊。
。
我们需要去AndroidManifest.xml中修改:
activityandroid:
name="
.DialogActivity"
theme="
@android:
style/Theme.Dialog"
intent-filter>
actionandroid:
android.intent.action.MAIN"
categoryandroid:
android.intent.category.LAUNCHER"
/intent-filter>
/activity>
我们给它增加了android:
theme的属性。
现在去activity_main.xml中去增加button:
Button
id="
@+id/start_normal_activity"
StartnormalActivity"
@+id/start_dialog_activity"
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();
onResume"
protectedvoidonPause(){
super.onPause();
onPause"
protectedvoidonStop(){
super.onStop();
onStop"
protectedvoidonDestroy(){
super.onDestroy();
onDestory"
protectedvoidonRestart(){
super.onRestart();
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("
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(){
publicvoidonClick(Viewv){
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("
"
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"
break;
caseR.id.remove_item:
YouclickedRemove"
Toast.LENGTH_SHORT).show();
caseR.id.huchi_item:
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("
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
activity
.FirstActivity"
launchMode="
singleTop"
label="
Thisishuchi&
apos;
sFirstActivity"
发现无论点多少次logcat都没有打印信息了。
不过在FirstActivity并未处于栈顶时,这时再启动FirstActivity,还是会创建新的实例的。
我们发现在FirstActivity和SecondActivity两个活动中跳来跳去可以在logcat看到打印的消息。
3.singleTask
singleTask模式可以解决上述问题。
每次启动活动时,系统会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动上面的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。
protectedvoidonRestart(){
Log.d(Tag,"
修改SecondActivity,添加onDestroy():
publicclassSecondActivityextendsAppCompatActivity{
SecondActivity"
//@Oride
//publicvoidonBackPressed(){
//Intentintent=newIntent();
//intent.putExtra("
"
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("
byebyehuchi"
setResult(RESULT_OK,intent);
finish();
Intentintent=getIntent();
Stringdata=intent.getStringExtra("
protectedvoidonDestroy(){
onDestroy"
观察logcat
4.singleInstance
最特殊最复杂的模式。
会启动一个新的返回栈来管理这个活动(如果singleTask模式下指定了不同的taskAffinity).singleInstance可以实现其他程序和我们的程序共享一个活动的实例。
在这种模式下会有一个单独的返回栈来管理这个活动,不管是哪个应用程序来访这个活动,都公用同一个返回栈。
实践出真
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- android 放弃 坚持 第二