Chapter 4 碎片
1 简单用法
<Button
android:id="@+id/button"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="click"
/>
<FrameLayout
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
android:id="@+id/right"
>
<fragment
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.asen.demo.RightFragment"
/>
</FrameLayout>
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
if (flag) {
RightFragmentNew f = new RightFragmentNew();
transaction.replace(R.id.right, f);
transaction.addToBackStack(null);
transaction.commit();
flag =false;
}else {
RightFragment f = new RightFragment();
transaction.replace(R.id.right, f);
transaction.addToBackStack(null);
transaction.commit();
flag = true;
}
transaction.addToBackStack(null); 将一个事务添加到返回栈中
2 xxFragment f = getFragmentManager.findFragmentByID(R.id.xxfragment)
3 onAttach onCreateView onActivityCreate ondestroyView ondetach
4 使用限定符Qualifiers
区别是 大屏 (平板) 还是 手机 加载 哪个布局文件
layout-large 文件夹 同名.xml 布局文件
使用 最小宽度限定符
layout-sw600dp 文件夹 最小宽度限定符 允许我们对要适配的屏幕指定一个最小值以dp为单位 大于这个值就加载这个布局 小于这个值就加载另一个布局了
Chapter 5 广播
1 标准广播 有序广播 系统广播 本地广播
标准广播 一个完全异步执行的广播 所有接收器几乎同时收到 没有先后顺序可言 效率比较高 但是无法被截获
有序广播 一个同步执行的广播 根据优先级 先后顺序接受 先接受者 有决定是否截留的逻辑处理选择
2 动态注册 静态注册
IntentFilter filter = new IntentFilter();
filter.addAction("android.net.connn.CONNECTIVITY_CHANG");
registerReceiver(receiver, filter);
unregisterReceiver(receiver);
<uses-sdk
android:minSdkVersion="17"
android:targetSdkVersion="21" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
静态注册 和 动态注册的不同 在于
动态注册 比较灵活 可以自由的控制 注册和注销 缺点是必须等待程序启动执行才可以接受广播
静态注册没有动态注册那么灵活 但是 在程序未启动时就可以接受 一般用于接受系统广播 (开机启动)
一般我们注册的action 都对应 相应的权限 不要忘记在 manifest.xml中进行配置
3 发送有序广播 sendOrderedBroadcast(intent, receiverPermission);
sendOrderedBroadcast(intent, null);
<receiver
android:name=".MyBroadCastReceiver"
>
<intent-filter
android:priority="100"
>
<action android:name="com.haha.mybroad"/>
</intent-filter>
</receiver>
自定义的广播接收器 的优先级 定为 100 保证在其他广播接收器之前收到
@Override
public void onReceive(Context context, Intent intent) {
abortBroadcast();//截留
}
4 本地广播
上述的标准广播 和 有序广播 以及 系统广播 都是系统全局广播 广播是一种跨进程通信机制 所以其他程序理论上也能收到该条广播的可能 存在安全性问题
本地广播只能在应用程序内部进行传递
唯一不同的是 引入了 LocalBroadcastManager 进行 注册 发送 注销
LocalBroadcastManager.getInstance(this).registerReceiver(xxReceiver, intentFilter);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
LocalBroadcastManager.getInstance(this).unregisterReceiver(xxReceiver);
5 应用 强制下线 由于可能处于不同的界面时 被踢下线 可以通过广播的形式 通知 接受者在 receive 方法里 进行下线的逻辑处理 弹窗 销毁 全部activity等
@Override
public void onReceive(Context context, Intent intent) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("this is title");
builder.setMessage("this is message ");
builder.setCancelable(false);
builder.setPositiveButton("ok", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Log.i("haha", "bingo");
}
});
AlertDialog dialog = builder.create();
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
dialog.show();
}
对话框的类型设置为 TYPE_SYSTEM_ALERT 不然不会再广播里弹出来