四种基本布局
- layout_gravity 指定控件位置
- weight 按照比例指定控件的大小
- LinearLayout 线性布局
orientation vertical,horizontal - RelativeLayout 相对布局
- FrameLayout 帧布局
- TableLayout 表格布局
stretchColumns 拉伸指定列自适应屏幕宽度
TableRowlayout_span
创建自定义控件
固定布局,通过layout布局文件自定义控件
LayoutInflater.from(context).inflate(R.layout.activity_main_layout,this);
-
ListView
- 优化使用ViewHolder
- view.setTag(viewHolder) 单位
- dp代替dx
动态获取屏幕密度值
getResources().getDisplayMetrics().xdpi;
getResources().getDisplayMetrics().ydpi;
.9图
碎片Fragment
新建类继承Fragment,重写onCreateView
,使用参数中的inflate.inflate()
方法填充布局, 返回view
layout布局中添加fragment指定name
属性为新建类
碎片动态添加
把Fragment布局放在FrameLayout布局中替换fragment布局
- 先new出继承Fragment,新实例
FragmentManager manager = getFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.content ,fragment);
transaction.commit();
按back键返回上一个fragment,可transaction.addToBackStack(null);
getActivity()
可获得与此fragment相关联的activity实例
getFragmentManager().findFragmentById()
获取碎片的实例
碎片的生命周期
- onAttach 碎片与活动相关联的时候调用
- onCreateView 碎片创建视图(加载视图)时候调用
- onActivityCreated 确保与碎片相关联的活动一定已经创建完毕的时候调用
- onDestroyView 当与碎片相关联的视图被移除的时候调用
- onDetach 当碎片与活动解除关联的时候调用
碎片完整的生命周期
添加一个碎片
- onAttach
- onCreate
- onCreateView
- onActivityCreated
- onStart
- onResume
- 碎片已激活
- onPause
- onStop
- onDestroyView
- onDestroy
- onDetach
- 碎片被销毁
广播接收器
- 标准广播
异步执行,所有广播接收器几乎同一时间接收到广播,没有先后顺序可言 - 有序广播
同步执行,同一时刻只有一个广播接收器能收到这条广播消息,有先后顺序,并可以截断正在传递的广播。
动态注册监听网络变化
代码中注册为动态注册,
AndroidManifest.xml
中注册为静态注册
创建广播接收器
继承BroadcastReceiver重写父类onReceive方法
MainActivity中代码`onCreate`方法中
IntentFilter intentFilter = new IntentFilter();
intentFileter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
netChangeReceiver(new 新对象)
registerReceiver(netChangeReceiver, intentFilter);
`onDestroy`方法中
unRegisterReceiver(newChangeReceiver);
重写`onReceive`方法
ConnectivityManager cm = getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = cm.getActiveNetworkInfo();
此服务监听需要申请权限。
ACCESS_NETWORK_STATE
开机启动权限BOOT_COMPLETED
开机监听RECEIVE_BOOT_COMPLETED
后台运行allowBackup
自定义广播消息
new Intent("消息的字段内容");
sendBroadcast(intent);
发送有序广播
sendOrderedBroadcaset(intent, null);
第二个参数是与权限相关的字符串
abortBroadcast拦截广播
以上为系统广播,下面为本地广播。
LocalBroadcastManager对广播进行管理
广播的最佳实践,强制下线
alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
需要申请权限。
广播里面启动活动,需要
intent.addFlag(Intent.FLAG_ACTIVITY_NET_TASK);