1. 在活动中使用 Menu
准备工作:
- 在 res 文件夹下创建 menu 文件夹,并生成菜单文件(xml格式)
Activity 中有 2 个重要方法需要复写:
-
此方法用于创建菜单,返回值为 true 表示将菜单显示出来
public boolean onCreateOptionsMenu(Menu menu)
-
此方法用于创建菜单子项,可用
getItemId()
获取相对应 item
public boolean onOptionsItemSelected(MenuItem item)
2. 销毁一个活动
finish()
3. 隐式 Intent
不在活动中明确指出启动哪个活动,而是在 AndroidManifest.xml 中配置想要启动的活动的 <action> 和 <category> 信息,并交由系统分析启动哪个活动
-
<action> 的配置信息:
<action android:name = "包名.ACTION_START"/>
-
<category> 的配置信息:
<category android:name = "android.intent.category.DEFAULT"/>
-
<category> 可追加:
addCategory()
<category android:name = "包名.大写_大写"/>
调用浏览器功能:
Intent intent = new Intent(Intent_ACTION_VIEW)
intent.setData(Uri.parse("http://www.baidu.com"))
—— Intent.ACTION_VIEW 的常量值为 android.intent.action.VIEW
如果在 AndroidManifest.xml 中配置活动的 <action> 值为此常量值,那么该活动也能响应打开网页的 Intent
调用拨号功能:
Intent intent = new Intent(Intent.ACION_DIAL)
intent.setData(Uri.parse("tel:10010"))
4. 向下一个活动传递数据:
发送数据:
intent.putExtra()
—— 该方法接收键值对参数
接收数据:
intent.getIntent()
—— 该方法用于获取到启动目标活动的 Intent
getIntExtra()
或 getStringExtra()
等
—— 此类方法传入相应的键值即可获得数据
5. 返回数据给上一个活动:
-
Activity 中有一个
void startActivityForResult()
方法也用于启动活动,以此方法启动的活动在销毁时可以返回数据给上一个活动,void startActivityForResult()
接收 2 个参数,第一个是 Intent,第二个是 requestCode,需要是唯一值,用于在之后的回调方法中判断数据来源 -
当目标活动想要回传数据,则需要调用
setResult()
方法,此方法是专门用于向上一个活动返回数据的,接收 2 个参数,第一个用于向上一个活动返回处理结果,一般是 RESULT_OK;第二个是携带数据的 Intent -
当活动销毁后会回调上一个活动的
void onActivityResult()
方法,因此需要复写此方法:
protected void onActivityResult(int requestCode,int resultCode,Intent data)
方法体内首先判断 requestCode 的值,接着判断 resultCode 的结果 -
如果希望按下 Back 键也能返回数据,则复写
void onBackPressed()
方法即可,将返回数据的逻辑在方法体内再编写一次
6.活动被回收了怎么办:
- 想要保存活动的临时数据可复写
void onSaveInstance()
方法,在此方法中可用 Bundle 的putInt()
,putString()
等方法将数据传入 Bundle,接着在void onCreate()
方法中判断savedInstanceState
是否为空,不为空即可用getInt()
,getString()
等方法取出数据
@Override
protected void onSaveInstance(Bundle outState){
super.onSaveInstanceState(outState);
}
7.活动的启动方式:
- standard:即使活动位于栈顶,依然能从此活动创建新实例
- singleTop:活动位于栈顶时不能创建新实例
- singleTask:返回栈中仅会存在单个活动的单个实例
- singleInstance:启用新的返回栈来管理所启动的新活动
8.管理所有活动:
-
创建一个 BaseActivity 基类,继承自 AppCompatActivity,并复写
void onCreate()
方法,让所有活动继承 BaseActivity
Log.d("BaseActivity",getClass().getSimpleName())
可以知道当前进入的是哪个活动 -
创建 ActivityColector 类作为活动管理器:
首先定义一个 List 来管理活动
private static List<Activity> activities = new ArrayList<>()
定义添加、移除、全局退出这三个静态成员方法
public static void addActivity(Activity activity){
activities.add(activity);
}
public static void removeActivity(Activity activity){
activities.remove(activity);
}
public static void finishAll(){
//遍历 activities
for(Activity activity : activities){
//判断是否被系统回收
if(!activity.isFinishing()){
activity.finish();
}
}
//清空列表
activities.clear();
}
- 最后在 BaseActivity 中
在void onCreate()
方法中添加ActivityCollector.addActivity(this)
在void onDestroy()
方法中添加ActivityCollector.removeActivity(this)
- 基于 BaseActivity,任何子类活动皆可调用
void finishAll()
方法来执行退出程序的功能。另外,想要完全退出程序还可以调用下面的方法
android.os.Process.killProcess(android.os.Process.myPid())
此方法用于杀掉当前进程,它接收一个进程 id 参数,通过myPid()
方法可以获得当前程序的进程 id
9.启动活动的最佳写法:
- 为每个活动添加静态方法
void actionStart(Context context)
,参数至少需要有一个 Context 对象,如需要传递数据则添加相应的数据类型即可
public static void actionStart(Context context){
Intent intent = new Intent(context,Activity.class);
context.startActivity(intent);
}
网友评论