安卓四大常用组件之一:Activity(活动)
创建组件的流程如下:
- 编写相应的组件类
- 在AndroidManifest.xml中注册
Activity的子类如下:
//最基本的活动类
android.app.Activity
//提供列表控件的活动类
andoid.app.ListActivity
//支持碎片(Fragment)的活动类
android.support.v4.app.FragmentActivity
//支持ActionBar的活动类,应用主题是Theme.AppCompat
android.support.v7.app.AppCompatActivity
活动生命周期:多个活动由Task管理。
三种状态:
- 运行状态:进入前台,位于栈顶。
- 暂停状态:当前活动不在栈顶,但仍可见
- 停止状态:当前活动不在栈顶,完全覆盖,仍然保存所有状态,容易被GC回收。
七个方法:
- onCreate():活动初始化时调用。
- onStart():活动从不可见变为可见,但无法获得焦点。
- onResume():从暗色变为高亮,可以获得焦点。
- onPause():从运行到暂停状态调用该方法。
- onStop():从暂停状态到停止这状态调用该方法。
- onRestart():处于停止状态的活动,重新回到前台,变成活动状态。
- onDestroy():活动被销毁时调用。
三个嵌套:
- 整个生命周期的循环:onCreate()---->onDestory()
- 可见生命周期的循环:onStart()----->onStop()
- 前台生命周期的循环:oResume()-------->onPause()
Back键和Home键:
- Back:从栈中移除活动。
- Home:将Android桌面活动入栈。
活动之间的跳转:
Intent intent = new Intent(XXXActivity.this , XXXActivity.this);
// 启动下一个活动
void startActivity(Intent intent)
Intent是一个意图对象,意图附加数据(Extras)字段:通过键值对来保存数据。
单值参数:
- putExtras(String name,String value)
- putExtras(String name,int value)
多值参数:
- putExtras(String name,int [] value)
- putExtras(String name,Serializable value)
在接收的Activity中:
//获取意图、获取对象
Intent intent= this.getIntent();
Bundle bundle = intent.getExtras();
String userId = bundle.getString(“userId”);
Bundle的各式Getter方法
- getInt(String key)
- getString(String key)
- getSerializable(String key)
当前Activity中:(Activity之间跳转并返回值)
// 跳转需要返回值code
void startActivityForResult(Intent intent ,int requestCode)
// 需要重写方法
onActivityResult(int request,int resultCode,Intent data)
接收的Activity:
setResult(resultCode,(new Intent()),putExtra("userId",userId))
活动任务与返回栈:
任务相关的意图标志(Flag):
- FLAG_ACTIVITY_NEW_TASK //开始一个新任务
- FLAG_ACTIVITY_CLEAR_TOP //清除返回栈中的活动
Intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|FLAG_ACTIVITY_CLEAR_TOP)
Fragment:
目的:为了适配多种设备和屏幕尺寸(平板电脑、电视),碎片是用来描述活动的部分界面
注:通过活动实现两个碎片之间的通信和调用
Fragment的生命周期:
三种状态:
- 运行状态:可见,可获得焦点
- 暂停状态:可见,变暗,不可获得焦点
- 停止状态:碎片所在活动处于停止状态
11个方法:
- onAttach():与活动建立关联
- onCreate():创建、初始化碎片
- onCreateView():第一次绘制相关视图,返回值是相关视图
- onActivityCreated():所在活动创建完成
- onStart():所在活动从不可见变为可见,不能获得焦点
- onResume():所在活动从暗色变为高亮,可以获得焦点、接收事件
- onPause():碎片从运行状态到暂停状态
- onStop():碎片从暂停状态到停止状态
- onDestroyView():销毁碎片相关视图
- onDestroy():碎片被销毁
- onDeach():碎片与活动解除关系时调用
碎片相关类:
- FragmentActivity:V4包
- APPcompatActivity:V7包
- Activity
- Fragment:核心碎片类
- FragmentManager:管理碎片所在活动之间的交互和通信。
- FragmentTransaction:管理碎片事务
- ListFragment:包含ListView控件的碎片类
- DialogFragment:浮在活动窗口的碎片
注:列表类型碎片ListFragment、通过代码创建布局,不需要指定布局文件,不需要重写onCreateView()方法。
静态添加碎片到活动:不能在运行时动态删除和替换
通过FragmentManager:
- Fragment findFragmentById(int id)
- Fragment findFragmentByTag(String tag)//Fragment下的标签
动态添加碎片到活动:
通过碎片事务FragmentTransaction完成,重写onCreate()方法:
//创建碎片实例
EventsMasterFragment firstFragment=new EventsMasterFragment();
//FragmentManager对象
FragmentManager fragmentManager=new EventMasterFragment();
//获得FragmentTransaction对象
FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
//添加firstFragment碎片到fragment_container容器
fragmentTransaction.add(R.id.fragment_container,firstFragment);
//提交碎片
fragmentTransaction.commit();
管理碎片事务:
添加:
删除:
getFragmentManager().beginTransaction().remove(new EventsMasterFrament()).commit();
替换:
getFragmentManager().beginTransaction().replace(R.id.fragment_container,new EventsMasterFrament())
//.addToBackStack(null) //将碎片添加返回栈,可以返回上一个碎片
.commit();
碎片与活动之间的通信:
一号路线:
MainActivity activity = (MainActivity)getActivity();
二号路线:
EventsDetailFragment detailFragment = (EventsDetailFragment) getFragmentManager().findFragmentById(R.id.fragment_detail);
实例:手机显示和平板显示
创建两个碎片:
Master碎片:
//返回所有项目名称String集合
String[] titles = new String[EventsDAO.list.size()];
for(int i=0;i<titles.length;i++){
Events e=EventsDAO.list.get(i);
titles[i]=e.getName();
}
setListAdapter(new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_activated_1,titles));
Detail碎片:
//设置详细视图
public void updateDetailView(int position) {
// 获取选中的比赛项目
Events events = EventsDAO.list.get(position);
// 获取当前碎片所在的活动
Activity activity = this.getActivity();
// 获得碎片中的ImageView对象
ImageView imageView =(ImageView) activity.findViewById(R.id.imageView_detail);
imageView.setImageResource(getLogoResId(events.getLogo()));
// 获得碎片中的TextView对象
TextView textView = (TextView) activity.findViewById(R.id.textView_detail);
textView.setText(events.getDescription());
mCurrentPosition = position;
}
// 通过logo资源文件名获得资源id
private int getLogoResId(String logo) {
// 获得活动的包名
String packageName = this.getActivity().getPackageName();
// 截取掉文件后缀名
int pos = logo.indexOf(".");
String logoFile = logo.substring(0, pos);
// 资源文件名获得资源id
int resId = this.getActivity().getResources()
//参数:1.图片文件名2.资源文件类型3.资源文件包
.getIdentifier(logoFile, "mipmap", packageName);
return resId;
}
创建MainActivity活动:
if(findViewById(R.id.fragment_container)!=null){
if(savedInstanceState!=null){
return;
}
// 创建碎片实例
EventsMasterFragment firstFragment=new EventsMasterFragment();
// 将意图的扩展数据(Extras),放到碎片参数中
firstFragment.setArguments(getIntent().getExtras());
// 获得FragmentManager对象
FragmentManager fragmentManager=getFragmentManager();
// 获得FragmentTransaction对象
FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
// 添加firstFragment碎片到fragment_container容器
fragmentTransaction.add(R.id.fragment_container,firstFragment);
// 提交碎片
fragmentTransaction.commit();
}
手机和平板加载不同的activity_mian.xml:
//用户从Master碎片选中列表项时调用
@Override
public void onEventsSelected(int position) {
// 使用FragmentManager通过id获得详细碎片
EventsDetailFragment detailFragment = (EventsDetailFragment)getFragmentManager().findFragmentById(R.id.fragment_detail);
if (detailFragment != null) {
// 如果Detail碎片可用,则说明是两栏布局情况
// 调用该方法更新Detail碎片内容
detailFragment.updateDetailView(position);
} else {
// 如果Detail碎片不可用,则说明是单栏布局情况
// 创建新的Detail碎片
EventsDetailFragment newFragment = new EventsDetailFragment();
Bundle args = new Bundle();
args.putInt(EventsDetailFragment.EVENTS_, position);
newFragment.setArguments(args);
FragmentTransaction transaction = getFragmentManager().beginTransaction();
// 替换fragment_container中的原有碎片
transaction.replace(R.id.fragment_container, newFragment);
// 添加碎片事务到返回栈,以便于用户单击Back能够导航回到上一个碎片
transaction.addToBackStack(null);
// 提交碎片事务
transaction.commit();
}
}