这是我参与「第四届青训营 」笔记创作活动的第1天
今天结合青训营第二节的授课内容,分享一下《第一行代码》第二章——探究活动2.1节到2.5节的读书笔记。
主要是讲安卓开发最基础的组件之一——Activity。
零基础的同学可以通过这部分内容对安卓开发有一个初步的概念。
Activity的用法
创建Activity
Activity目录:app/src/main/java/com.example.myapplication/MainActivity.java 布局文件目录:app/src/main/res/layout/activity_main.xml
-
为活动加载布局文件:在Activity的onCreate函数中添加
setContentView(R.layout.activity_main);
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }
-
在AndroidManifest.xml (app/src/main/AndroidManifest.xml) 中注册Activity,一般由Android Studio自动完成。
<application> <activity android:name=".MainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application>其中,
<action android:name="android.intent.action.MAIN" />
两行表示该活动是这个项目的主活动。
使用Toast
Toast: 提示消息
Toast的用法:通过静态方法makeText()创建一个Toast对象,调用show()将Toast显示出来。
Button button1 = (Button) findViewById(R.id.button1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this, "message", Toast.LENGTH_SHORT).show();
}
});
使用Menu
-
在app/src/main/res/menu中新建main.xml,<item>标签标识具体的菜单项。
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/add_item" android:title="Add"/> <item android:id="@+id/remove_item" android:title="Remove"/> </menu>
-
在Activity类中重写onCreateOptionsMenu方法创建菜单。
@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; //true: 显示菜单;false: 不显示菜单 }
-
在Activity类中重写菜单响应事件onOptionsItemSelected()。
@Override public boolean onOptionsItemSelected(@NonNull MenuItem item) { switch (item.getItemId()){ case R.id.add_item: Toast.makeText(this, "You clicked Add", Toast.LENGTH_SHORT).show(); break; case R.id.remove_item: Toast.makeText(this, "You clicked Remove", Toast.LENGTH_SHORT).show(); break; default: } return true; }
销毁活动
按返回键或调用finish()方法。
intent的用法
Intent是Android程序中各组件之间进行交互的一种重要方式,一般可用于启动活动,启动服务以及发送广播等场景。
显式intent
此处用到的Intent的构造函数:Intent(Context packageContext, Class<?> cls) 第一个参数要求提供一个启动活动的上下文,第二个参数指定想要启动的目标活动。
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this, Activity2.class);
startActivity(intent);
}
});
隐式intent
AndroidManifest中,在<activity>标签下配置<intent-filter>的内容,指定当前活动能够响应的action,category,data等。
<activity
android:name=".Activity2"
android:exported="false" >
<intent-filter>
<action android:name="com.example.myapplication.ACTION_START"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
将点击事件修改为:
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent("com.example.myapplication.ACTION_START");
startActivity(intent);
}
});
此处用到的intent的构造函数直接传入了action的字符串,表示我们要启动能够响应"com.example.myapplication.ACTION_START"这个action的活动,同时category自动设为默认值。
其他用法
- 启动系统其他程序的活动,比如调用浏览器
- 向下一个活动传递数据
- 返回数据给上一个活动
活动的生命周期
返回栈
活动的状态
- 运行状态:活动位于返回栈栈顶时。
- 暂停状态:活动不在栈顶位置,但依然可见时(栈顶的活动并不占满整个屏幕)。
- 停止状态:活动不在栈顶位置,而且不可见时。可能会被系统回收。
- 销毁状态:活动从返回栈中移除后。容易被系统回收。
活动的生命周期
- 完整生存期:onCreate()方法和onDestroy()方法之间。一般会在onCreate()方法中完成活动的初始化操作,在onDestroy()方法中完成释放内存的操作。
- 可见生存期:onStart()方法和onStop()方法之间。可以通过这两个方法合理管理那些对用户可见的资源,比如在onStart()方法中加载资源,在onStop()方法中释放资源。
- 前台生存期:onResume()方法和onPause()方法之间。此时活动处于运行状态,可以和用户进行交互。
没提到的onRestart()方法在活动由停止状态变为运行状态之前调用。
储存临时数据
为了在活动被系统回收前存储当前活动的数据,应该重写Activity的onSaveInstanceState()方法,该方法可以保证活动在被回收之前一定会被调用。
在onSaveInstanceState()方法中将需要储存的数据存入onSaveInstanceState()方法的Bundle类型的参数中。 可以通过onCreate()方法的Bundle类型的参数取出之前保存的数据,该参数默认为null,但如果活动被回收之前有调用过onSaveInstanceState()方法,那么该参数就会带有之前保存的数据。
Bundle存数据:putInt(key, value),putString(key, value),...
取数据:getInt(key),getString(key),...
可以和intent结合使用。
活动的启动模式
在AndroidManifest.xml中通过<activity>标签指定android:launchMode属性来选择。
- standard:默认模式。每次启动都会创建一个新的实例并压入返回栈中。
- singleTop:启动活动时如果返回栈的栈顶已经时该活动,则直接使用它,不再创建新的活动实例。
- singleTask:启动活动时检查返回栈中是否有该活动的实例,若有则直接使用该实例并将其上的所有活动出栈,若没有则创建新的活动实例。
- singleInstance:启用一个新的返回栈管理这个活动,解决了共享活动实例的问题。
参考:
《第一行代码》第二版
developer.android.com/guide/compo…
juejin.cn/post/712271…