Android - weight,patch图片,shape图形,ListView,服务

转载请注明出处:https://blog.csdn.net/mythmayor/article/details/72879098

1.android:layout_weight的用法

1.android:layout_weight:权重比例,将剩余空间按比例分配。只可在线性布局中使用
2.指定android:layout_weight属性后,
    如果线性布局是水平的,View的宽度=原有宽度+线性布局剩余空间的占比
    如果线性布局是竖直的,View的高度=原有高度+线性布局剩余空间的占比
3.Android官方推荐,在使用android:layout_weight时,
    如果线性布局是水平的,要将android:layout_width设置为0dp
    如果线性布局是竖直的,要将android:layout_height设置为0dp

2.9patch图片(.9.png拼接图片)

1号黑色条位置向下覆盖的区域表示图片横向拉伸时,只拉伸该区域   
2号黑色条位置向右覆盖的区域表示图片纵向拉伸时,只拉伸该区域   
3号黑色条位置向左覆盖的区域表示图片纵向显示内容的区域  
4号黑色条位置向上覆盖的区域表示图片横向显示内容的区域

3.shape图形

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
     <!-- 矩形|椭圆|线|环 -->  
    android:shape=["rectangle" | "oval" | "line" | "ring"] >
    <!-- 圆角 -->  
    <corners
        android:radius="integer"
        android:topLeftRadius="integer"
        android:topRightRadius="integer"
        android:bottomLeftRadius="integer"
        android:bottomRightRadius="integer" />
    <!-- 固定色 -->
    <solid
        android:color="color" />
    <!-- 渐变色 -->  
    <gradient
        android:type=["linear" | "radial" | "sweep"] 
                    //linear 线性渐变,这是默认设置
                    //radial 放射性渐变,以开始色为中心
                    //sweep 扫描线式的渐变。
        android:startColor="color" //颜色值 起始颜色
        android:endColor="color" //颜色值 结束颜色
        android:centerColor="integer" //渐变中间颜色,即开始颜色与结束颜色之间的颜色
        android:angle="integer" //渐变角度
        android:centerX="integer" //渐变中心X点坐标的相对位置
        android:centerY="integer" //渐变中心Y点坐标的相对位置
        android:gradientRadius="integer" //渐变色半径.当 android:type="radial" 时才使用。单独使用 android:type="radial"会报错 />
    <!-- 边框 -->
    <stroke
        android:width="integer"
        android:color="color"
        android:dashWidth="integer"
        android:dashGap="integer" />
    <!-- 边距 -->  
    <padding
        android:left="integer"
        android:top="integer"
        android:right="integer"
        android:bottom="integer" />
    <!-- 大小 一般不指定-->
    <size
        android:width="integer"
        android:height="integer" />
</shape>

4.获取RadioGroup中被选中的条目

1.调用RadioGroup的getCheckedRadioButtonId方法

5.使用命令行查看数据库

1.sqlite3 mythmayor.db命令进入数据库模式

6.ListView空数据的处理

1.在布局文件中添加上空数据时的布局
2.在适配器的getCount方法中,根据数据是否为0,对空数据时的布局进行显示和隐藏

7.ListView的优化

1.复用历史缓存的view对象convertView,减少view对象创建的次数
2.使用ViewHolder保存子View引用,减少findViewById的次数

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view ;
    ViewHolder holder;
    //1.复用历史缓存的view对象convertView,减少view对象创建的次数
    if(convertView==null){
        view = View.inflate(CallSmsSafeActivity.this, R.layout.item_call_smssafe, null);
        //2.ViewHolder保存子View引用
        holder = new ViewHolder();
        holder.tv_phone = (TextView) view.findViewById(R.id.tv_item_blacknumber);
        holder.tv_mode = (TextView) view.findViewById(R.id.tv_item_mode);
        holder.iv_delete = (ImageView) view.findViewById(R.id.iv_item_delete);
        //ViewHolder保存到View对象里
        view.setTag(holder);
    }else{
        view = convertView;
        holder = (ViewHolder) view.getTag();
    }
}

/**
 * view 的容器,用来存储子孩子的引用.
 */
class ViewHolder{
    TextView tv_phone;
    TextView tv_mode;
    ImageView iv_delete;
}

8.加载大量数据的优化方法

1.初始化
    1.1 在布局文件中加入进度条,加载数据之前显示进度条
    1.2 加载数据放在子线程中,加载数据后隐藏进度条
    1.3 调用runOnUiThread方法修改界面
2.非初始化
    2.1 不再重新查找所有数据,仅添加单条数据到集合中
    2.2 将需要的其他数据也添加到Intent中
    2.2 添加单条数据到集合里,刷新界面

9.优化的本质和原则

1.本质:拆东墙补西墙,根据需求进行取舍。
2.原则:
    2.1 时间换时间——禁用开机启动项
    2.2 时间换空间——byte[] buf=new byte[1024].
    2.3 空间换时间——Everythings,Android图库,创建本地文件保存数据索引
    2.4 空间换空间——虚拟内存,ramdisk
3.补充Universal Image Loader的核心原理
    3.1 运用空间换时间,将从服务器获取的图片缓存到内存里。
    3.2 内存的空间是有限的,运用空间换空间,在SD卡里也将图片缓存一份
    3.3 取图片的时候先从内存中取,因为内存取最快
    3.4 内存中没有的时候从SD卡里取

10.监听来电状态

private TelephonyManager tm;
private MyPhoneStateListener listener;

//1.初始化时注册一个电话状态的监听器
@Override
public void onCreate() {
    tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
    listener = new MyPhoneStateListener();
    tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
    super.onCreate();
}

//2.创建电话状态监听器
private class MyPhoneStateListener extends PhoneStateListener{
    @Override
    public void onCallStateChanged(int state, String incomingNumber) {
        super.onCallStateChanged(state, incomingNumber);
        switch (state) {
        case TelephonyManager.CALL_STATE_IDLE://空闲状态

            break;
        case TelephonyManager.CALL_STATE_RINGING://响铃状态
            String mode = dao.find(incomingNumber);
            //1.电话拦截 2 短信 3全部拦截.
            if("1".equals(mode)||"3".equals(mode)){
                Log.i(Tag,"挂断电话");
            }
            break;
        case TelephonyManager.CALL_STATE_OFFHOOK://接通电话状态.

            break;
        }
    }
}

//3.注销时释放资源
@Override
public void onDestroy() {
    super.onDestroy();
    tm.listen(listener, PhoneStateListener.LISTEN_NONE);
    listener = null;
}

11.判断某个服务是否处于运行状态

public static boolean isServiceRunning(Context context,String serviceFullName){
    //得到系统的进程管理器
    ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    //得到系统里面正在运行的服务
    List<RunningServiceInfo>  infos = am.getRunningServices(200);
    for(RunningServiceInfo info:infos){
        if(serviceFullName.equals(info.service.getClassName())){
            return true;
        }
    }
    return false;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值