这里的一些实例代码我已经上传到Github:https://github.com/Silence9102/Exercise_Android/tree/master/Exercise_Activity
一、 Activity从创建到销毁
1. 基础知识部分:
Activity的生命周期流程图:
Activity生命周期的四个状态及其大概意思:
- 运行状态: 此时该Activity正处于屏幕最前面,是正与用户进行交互的界面
- 暂停状态: 此时该Activity被其他Activity部分遮挡,可以被看到,但是无法被操作,上图中调用OnPause()方法之后就进入了暂停状态。此时如果系统内存极端低下该Activity将被系统杀掉释放内存
- 停止状态: 此时该Activity已经彻底被其他Activity所覆盖,即将被销毁或者等待用户重新唤醒,上图中调用了OnStop()方法就进入了停止状态。这时当系统内存需要被用在其他地方时,停止状态的Activity将被杀掉
- 销毁状态: 调用了OnDestroy()方法,此时该Activity的进程已经被杀死
2. 实例部分
一个Activity的创建到销毁所使用的方法:
- 创建一个自定义Activity类继承Activity类同时重写其onCreate()方法:
public class CreateActivity_ByJava extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//这里的布局文件需要自行在res/layout目录下创建然后在这里以setContentView()方法设置
super.setContentView(R.layout.createactivity_byjava);
}
}
- 建立该Activity的布局文件并在自定义Activity类中设置为布局
- 在AndroidManifest.xml文件中使用activity标签配置自定义的Activity,例如:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.exercise_activity">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
tools:ignore="GoogleAppIndexingWarning">
<!--手动创建的CreateActivity_ByJava的配置项-->
<activity android:name=".CreateActivity_ByJava"></activity>
<!--系统自动创建的MainActivity的配置项-->
<activity android:name=".MainActivity">
<intent-filter>
<!--关于下面两个语句的name属性值看这篇博客的介绍:https://blog.csdn.net/lindroid20/article/details/51993247-->
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
- 启动自定义的Activity:
//通过Intent和startActivity方法来启动新的Activity
//这里Intent构造参数中第一个参数是上下文对象,第二个是指定好要启动的Activity的主类
Intent intent = new Intent(MainActivity.this,CreateActivity_ByJava.class);
startActivity(intent);
- 通过finish()方法关闭当前Activity
//关闭当前Activity,如果是子Activity就返回启动它的父Activity,否则就返回系统主界面
finish();
二、 通过Bundle和Intent进行Activity之间的数据传输
1. 从当前Activity传输数据到新的Activity
首先在当前Activity中把数据以key-value的方式存储在实例化的bundle中,这里使用了putCharSequence() 方法,存储一组 “key-字符串” 数据,接下来将封装好数据的bundle通过intent传输到新打开的Activity
//实例化一个Bundle用于存储数据
Bundle bundle = new Bundle();
//将在TextView输入的信息以key-value的方式存储在bundle中
bundle.putCharSequence("name",et_name.getText().toString());
//将bundle放进intent传递到另一个Activity中
intent.putExtras(bundle);
startActivity(intent);
接下来在新打开的Activity中通过Bundle获取到传递过来的数据就可以了,这里的getExtras() 方法是用于获取传输过来的Intent中的bundle,而传输过来的Intent通过getIntent() 方法获取
//获取从之前的Activity中传递的Intent中的bundle
Bundle bundle = getIntent().getExtras();
//在bundle中通过key提取出对应的value
String name = bundle.getString("name");
2. 从新打开的Activity中获取数据
这里以一个修改头像的实例来叙述过程:
首先在当前Activity以startActivityForResult() 这个方法来启动新的Activity
//以startActivityForResult方法启动Activity,同时设置0x11为发起修改头像动作的请求码
startActivityForResult(intent,0x11);
然后在新打开的头像选择Activity选择一个头像并将其资源ID封装到一个实例化的Bundle中,然后通过 setResult() 将数据传输回去
Intent intent = new Intent();
Bundle bundle = new Bundle();
bundle.putInt("imageId",ico[i]);
intent.putExtras(bundle);
//将选择的头像资源ID通过intent传回父Activity然后通过finish()方法销毁该Activity
setResult(0x11,intent);
finish();
//将选择的头像资源ID通过intent传回父Activity然后通过finish()方法销毁该Activity
setResult(0x11,intent);
finish();
最后在开始的Activity中通过重写onActivityResult() 方法来获取传输回来的数据,这里获取数据也是通过Bundle和Intent
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//检查requestCode是不是设置的修改头像的识别码
// 检测返回的resultCode是不是从选择头像Activity返回的识别码
//关于requestCode和resultCode的解析看这个:https://blog.csdn.net/u010542873/article/details/51219352
if(requestCode==0x11 && resultCode==0x11){
//获取从头像展示Activity返回的已选头像图片ID,将头像修改为该图片
Bundle bundle = data.getExtras();
ImageView imageView = findViewById(R.id.imageView_main_ico);
imageView.setImageResource(bundle.getInt("imageId"));
}
}
三、 Fragment的基础使用
Fragment有两种方法创建,但是在那之前先创建一个继承Fragment类的自定义fragment类,在其中重写onCreateView()方法,比如这个Message_Fragment:
public class Message_Fragment extends Fragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
//这里的布局方式参数可以是专门创建的专用的布局文件,也可以使用已经存在的布局文件
return inflater.inflate(R.layout.fragment_message,container,false);
}
}
两种创建方式:
-
1 . 静态的在XML布局文件中描述
在XML文件中使用fragment这个标签来设置一个静态的Fragment,这里会用到一个属性而且这个属性必须被使用并设置好,否则会在应用启动这个fragment时发生闪退:
- android:name:其作用是指定这个fragment使用哪个配置文件,属性值为配置文件的包路径。比如:android:name="com.example.fragment.Message_Fragment"的属性值就是指使用com.example.fragment包中的Message_Fragment.java配置文件。
-
2 . 在Java文件中动态创建一个Fragment
使用下面的一段代码即可在id为main_layout的布局管理器中添加一个自定义好的message_fragment
//获取fragment管理器并启动一个fragment事务 FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); //实例化一个自定义fragment类作为add()方法的参数 Message_Fragment message_fragment = new Message_Fragment(); //设置放置fragment的容器id和要放置的fragment fragmentTransaction.add(R.id.main_layout , message_fragment); //提交事务 fragmentTransaction.commit();