胡言乱语自学皮毛

编程入门 行业动态 更新时间:2024-10-08 04:31:59

<a href=https://www.elefans.com/category/jswz/34/921622.html style=胡言乱语自学皮毛"/>

胡言乱语自学皮毛

昨天好像看到书的第46页。
以后就在博客做做笔记什么的吧。
现在在看P45的Intent

一、显式Intent

Intent是Android各组件之间进行交互的一种重要方式。
不仅仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据。
目前为止只考虑Intent启动活动。
显式intent的构造方法是(Context,Class)
Context是启动活动的上下文(上下文這個概念現在還是不是很理解)
Class就是要启动的活动啦。

public void onClick(View view) {Intent intent = new Intent("com.example.myapplication.ACTION_START");/*Activity中提供的专门用来启动其他活动的方法,参数是需要一个Intent*/startActivity(intent);
}

这样就做好了一个显示Intent启动第二个活动。
用户点击Back键就可以销毁当前活动,也就是返回上一个活动了。
使用这种方式来启动活动,Intent的“意图”非常明显,因此我们称之为显式Intent。

二、隐式Intent

对比与显式Intent,隐式不明确指出想要启动哪一个活动,而是通过action和category,让系统去分析这个Intent并找出合适的活动去启动。
问题来了,什么叫做合适的活动呢?
就是可以响应这个Intent的活动。
因为我现在是想通过MainActivity来的button1来启动SecondActivity,那么SecondActivity可以响应哪个Intent呢?
要在活动注册界面来指定当前活动可以响应的action和category

 <activity android:name=".SecondActivity"><intent-filter>/*这一段代码表示,SecondActivity活动,可以响应拥有这个action和category的**Intent***/<action android:name="com.example.myapplication.ACTION_START"/><category android:name="android.intent.category.DEFAULT"/></intent-filter></activity>

再回到MainActivity.java中

Intent intent = new Intent("com.example.myapplication.ACTION_START");

这句话就是隐式Intent的构造方法了。把SecondActivity可以响应的action拿来构建Intent。
这样,SecondActivity就可以响应这个对应的Intent了。
但是之前说过,想要Intent--------------Activity对应上
必须要actioncategory同时对应上,为什么这里只对应了一个action就可以了?
因为现在这个时候,category是default,也就是默认的。
在startActivity(intent)的时候会自动添加默认的category。
如果在活动注册xml中,SecondActivity添加了另外的category,那么intent也要addCategory
活动注册组件中:

activity android:name=".SecondActivity"><intent-filter><action android:name="com.example.myapplication.ACTION_START"/><category android:name="android.intent.category.DEFAULT"/><category android:name="com.example.myapplication.MY_CATEGORY"/></intent-filter>

对应Intent也要添加一个新的category

 public void onClick(View view) {
//                Toast.makeText(MainActivity.this,"You clicked Button 1",Toast.LENGTH_SHORT).show();/*下面两句,表示了我们想要启动,启动什么呢?启动,能够响应这个action的活动,且我们之前写的,只有SecondActivity才可以响应这个action*/Intent intent = new Intent("com.example.myapplication.ACTION_START");intent.addCategory("com.example.myapplication.MY_CATEGORY");startActivity(intent);}});

三、向下一个活动传输数据

首先还是使用Intent,通过对应action值和category值来确定所要启用的activity活动
然后,通过putExrta()方法传递一个字符串
但是putExrta方法有两个参数,一个是键,用于后面从Intent取值;第二个才是真正要传递的数据。

public void onClick(View view) {
//                Toast.makeText(MainActivity.this,"You clicked Button 1",Toast.LENGTH_SHORT).show();/**/String data = "MainActivity's Data";Intent intent = new Intent("com.example.myapplication.ACTION_START");/*这个Intent建立了这个按钮和SecondActivity的跳转关系*/intent.putExtra("extra_data",data);intent.addCategory("com.example.myapplication.MY_CATEGORY");startActivity(intent);}

在SecondActivity活动中,也得接收一下数据。

 Intent intent = getIntent();String data = intent.getStringExtra("extra_data");Log.d("SecondActivity",data);

四、返回数据给上一个活动

之前学了,使用startActivity(Intent intent)来使用intent和要开启的活动相关联。
这是一个开启活动的方法,另一个开启活动的方法是:startActivityForResult()
但这个方法期望在活动销毁的时候返回一个结果给上一个活动。

 button1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {
//                Toast.makeText(MainActivity.this,"You clicked Button 1",Toast.LENGTH_SHORT).show();/*下面两句,表示了我们想要启动,启动什么呢?启动,能够响应这个action的活动,且我们之前写的,只有SecondActivity才可以响应这个action*/Intent intent = new Intent("com.example.myapplication.ACTION_START");intent.putExtra("extra_data",data);intent.addCategory("com.example.myapplication.MY_CATEGORY");/*1只是一个请求码,就像钥匙对应锁孔一样,返回值的时候需要对应到这个独一无二的请求码;*/startActivityForResult(intent,1);}});

在SecondActivity代码中:

button2.setOnClickListener(new View.OnClickListener(){public void onClick(View view){Intent intent = new Intent();intent.putExtra("data_return","Hello Main!");setResult(RESULT_OK,intent);finish();}

要做的是点击按钮来结束SecondActivity并且返回值
这是还是做了一个Intent来携带值,但是这个Intent并没有和任何活动来关联,就是携带值用的工具;

setResult() 这个方法很重要。第一个参数用于向上返回结果,一般用RESULT_OK或者RESULT_CANCELED ,第二个参数就是返回带着你要的内容的intent,finish来销毁当前活动;

下一步,因为我们是使用setActivityForResult来启动SecondActivity的,在SecondActivity被销毁之后要回调上一个活动的onActivityResult() 方法,因此需要在MainActivity来重写这个方法,得到返回的数据。
书本P54,略;

五、活动的生命周期

就是栈结构,后进先出结构,启动了一个新活动,它就在返回栈中入栈,并且处于栈顶的位置;
Android的活动有这4个状态:1.活动状态 2.暂停状态 3.停止状态 4.销毁状态
1️⃣onCreate(),在活动第一次被创建的时候调用。你应该在这个方法中完成活动的初始化操作,比如说加载布局,绑定事件等。
2️⃣onStart(),再活动由不可见变的可见的时候用。
3️⃣onResume(),在活动准备好和用户进行交互的时候调用。这个时候活动一定位于返回栈的栈顶,并处于运行状态。
4️⃣onPause(),在系统准备去启动or回复另一个活动的时候调用。通常会在这个方法中将一些消耗CPU的资源释放掉,以及保存一些关键数据。但这个方法的执行速度一定要快,不然会影响到新的栈顶活动的使用。
5️⃣onStop(),在活动完全不可见的时候调用。它和onPause()方法的主要区别在于,如果启动的新活动是一个对话框式的活动,那么onPause方法或得到执行,而onStop方法并不会执行
6️⃣onDesrtoy(),在活动被销毁之前调用,之后活动的状态将变成销毁状态。
⑦onRestart,在活动由停止状态变为运行状态之前调用,也就是活动被重新启动了。
周期这一段就看书做笔记吧,代码量有点大,而且复制不到换行,也不会用Logcat,读书总结一下理解。
书上P64~P66

小Tips就死onPause到onStop这里,如果打开的下一个活动是一个小的浮动的对话窗口,那么其实原本这个活动还是可见的,就回只启用onPause()而不会onStop();

六、活动被回收了怎么办

一个活动进入到了停止状态,是有可能被系统回收的。用户在活动A的基础上启动了活动B,那么活动A就回进入onStop()停止状态,如果这个时候系统内存不足,那么活动A就会被回收。但是如果刚刚活动A上的表单有用户输入的数据,虽然点击Back可以返回到活动A,但这个时候这些暂存的表单数据是清空的,因为这个时候只是看起来回到了活动A,其实是调用了onCreate()。
对于这种情况,Activity中提供了

onSaveInstanceState()

回调方法;这个方法会保证一定在活动被回收之前调用。使用这个方法解决活动被回收时的临时数据得不到保存的问题。
参数为Bundle的对象,Budle提供了一系列的方法用于保存数据:
putString()保存字符串、putInt()保存整型数据等等:

@Overridepublic void onSaveInstanceState(Bundle outState){super.onSaveInstanceState(outState);String tempData = "Something you just type";outState.putString("data_key",tempData);//第一个参数是键,用于取值的时候用;第二个参数就是要保存的内容啦。}

这个时候数据已经被保存下来了。如果要恢复数据的话,回顾一下。活动A上启动活动B,但是因为内存不足了,且活动A进入了停止状态所以被自动清理,虽然点击了Back,看起来是活动A在后台活得好好的,但是这个是再次调用onCreate()所产生的活动A,刚刚里面的临时数据都没有了;
在onCreate()方法里其实是有参数的,就是需要Bundle对象,
只要在onCreate()中添加下列代码

if(saveInstanceState!=null){String tempData = saveInstanceState.getString("data_key");
}

就获得了刚刚活动A被清理掉时存下来的临时数据。

七、活动的启动模式

在实际项目中,根据特定的需求为活动指定恰当的启动模式。分为四种:
1️⃣standard
2️⃣singleTop
3️⃣singleTask
4️⃣singleInstance
可以在注册组件中通过<activity android:launchMode>来选择启动模式。

1️⃣、standard

如果在活动A中有个按钮。按钮的事件是启动活动A。
那么每一次单击按钮都会创建出一个新的活动A实例,每一次新的都会在栈顶,所以要点3次Back才可以退出程序。

2️⃣singleTop

singTop模式不会出现这个问题。在singTop模式下,点击活动内启动活动自身的按钮,因为这个时候活动可见嘛,所以这个识货活动是在栈顶的。点击这个按钮会直接使用栈顶的活动,意思也就是直接使用当前状态的活动本身了。
但是如果是这个活动不在栈顶。比如:
活动A Button1(启动活动B)
活动B Button2(启动活动A)
Step1.在活动A点击Button1后,栈顶目前存在的是活动B(内存够用,活动A目前onStop(),未被清理);
Step2.此时界面为活动B,点击Button2,虽然此时活动A存活,但是栈顶为活动B,所以会直接再创建一个活动A;
Step3.现界面为新活动A,点击Back,销毁新活动A,返回活动B;现界面为活动B,再次点击Back,销毁活动B,返回活动A;现界面为活动A,再次点击Back,销毁活动A,栈内无活动,程序退出;

3️⃣singTask

singTaks启动模式,就是在栈中检查。
活动A Button1(启动活动B)
活动B Button2(启动活动A)
主界面为活动A;点击按钮。由于都为singTask模式,检查栈内无活动B,使用onCreate()创建了活动B,活动A进入onStop并位于栈底;
Stop2.现界面为活动B,点击按钮,由于未singTask模式,检查到了栈内有活动A,直接踢出其他所有活动,活动A成为栈内唯一活动并置顶。
Step3.现界面为活动A,点击Back,活动销毁,程序退出。

今日结束;P78后2.6.1后没看了,就是关于2.6.1“知晓当前是哪一个活动”,2.6.2“随时随地退出程序”,2.6.3“启动活动的最佳写法”明天再弄

更多推荐

胡言乱语自学皮毛

本文发布于:2024-02-13 20:13:30,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1760158.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:胡言乱语   皮毛

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!