android文章链接

  1. Dialog、Toast和Snackbar

  2. Android检查版本升级 另:版本更新

  3. 两次返回键退出

  4. String…和String[]区别

  5. 内存泄漏:
    1).内部类持有外部类的引用(例如外部活动类提前finish,而内部类持有引用,导致外部类内存泄漏)定义内部类时,要么是放在单独的类文件中,要么就是使用静态内部类。因为静态的内部类不会持有外部类的引用,所以不会导致外部类实例的内存泄露。当你需要在静态内部类中调用外部的Activity时,我们可以使用弱引用来处理。弱引用不一定能解决内存泄漏,因为在内存不足的时候,GC才会优先回收Weak Reference的内存。
    临时内存泄漏。
    2).Context造成的泄漏:改用ApplicationContext,常见的Dialog,Menu,悬浮窗,这些控件都需要传入Context作为参数的,如果要使用Activity作为Context参数,那么一定要保证控件的生命周期跟Activity的生命周期同步。窗体泄漏也是内存泄漏的一种,就是我们常见的leak window,这种错误就是依赖Activity的控件生命周期跟Activity不同步造成的。
    3).资源对象未关闭 :
    资源性对象如Cursor、File、Socket,应该在使用后及时关闭。未在finally中关闭,会导致异常情况下资源对象未被释放的隐患。
    4).Hanlder的使用:
    1、非静态的内部类默认会持有外部类的引用
    2、我们又使用非静态内部类创建了一个静态实例
    3、该静态实例的生命周期和应用一样长,这就导致了该静态实例一直会持有该activity的引用,导致activity不能正常回收。
    activity onDestroyed时mHandler.removeCallbacksAndMessages(null);
    5).线程造成的内存泄漏:例如activity结束,而线程里的任务还未执行完成,导致activty的内存资源无法回收,造成内存泄漏。在Activity销毁时候也应该取消相应的任务AsyncTask::cancel(),避免任务在后台执行浪费资源。
    6).监听器没有注销造成的内存泄漏:
    在Android程序里面存在很多需要register与unregister的监听器,我们需要确保及时unregister监听器。

  6. PendingIntent在AlarmManager、NotificationManager中的使用(和Intent的区别)

  7. Pattern(格式)与Matcher

  8. android常用工具类封装

  9. Activity、View、Window的理解

  10. null == obj vs obj==null:
    在c语言中使用前者可以防止obj=null,但是在java可以说没影响,因为obj=null在if或while中不是boolean,一样会报错。

  11. ProgressDialog使用总结

  12. 8.0系统中应用图标的适配

  13. startActivity后,后面的语句还是会继续执行的,finish();后后面的语句也是同样会执行的

  14. 通知栏适配
    通知渠道:

NotificationChannel channel = new NotificationChannel(channelId, channelName, importance);
NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
notificationManager.createNotificationChannel(channel);

  1. 代码规范
  2. 常用小工具
  3. 登陆拦截
  4. 线程池
  5. 定时器任务
  6. 广播
  7. 广播强制下线ActivityCollector
package com.example.dow.accountintercept;


import android.app.Activity;

import java.util.ArrayList;
import java.util.List;

public class ActivityCollector {
    public static List<Activity>activities=new ArrayList<Activity>();

    public static void addActivity(Activity activity){
        activities.add(activity);
    }

    public static void removeActivity(Activity activity){
        activities.remove(activity);
    }

    public static void finishAll(){
        for(Activity activity : activities){
            if (!activity.isFinishing()){
                activity.finish();
            }
        }
    }
}

  1. Intent中的Action、Data、Category、Extras
  2. meta-data
  3. 面试准备
  4. 测试横竖屏切换时activity 的生命周期
  5. 文章链接
  6. SharedPreferences的封装
public class ShareUtils {
    public static final String NAME="config";
    //写
    public static void putString(Context mContext,String key,String value){
        SharedPreferences sp=mContext.getSharedPreferences(NAME,0);
        sp.edit().putString(key,value).apply();
    }
    //读
    public static String getString(Context mContext,String key,String defValue){
        SharedPreferences sp=mContext.getSharedPreferences(NAME,0);
        return sp.getString(key,defValue);
    }

    //写
    public static void putInt(Context mContext,String key,int value){
        SharedPreferences sp=mContext.getSharedPreferences(NAME,0);
        sp.edit().putInt(key,value).apply();
    }
    //读
    public static int getInt(Context mContext,String key,int defValue){
        SharedPreferences sp=mContext.getSharedPreferences(NAME,0);
        return sp.getInt(key,defValue);
    }

    //写
    public static void putBoolean(Context mContext,String key,boolean value){
        SharedPreferences sp=mContext.getSharedPreferences(NAME,0);
        sp.edit().putBoolean(key,value).apply();
    }
    //读
    public static boolean getBoolean(Context mContext,String key,boolean defValue){
        SharedPreferences sp=mContext.getSharedPreferences(NAME,0);
        return sp.getBoolean(key,defValue);
    }

    //删除 单个
    public static void deleShare(Context mContext,String key){
        SharedPreferences sp=mContext.getSharedPreferences(NAME,0);
        sp.edit().remove(key).apply();
    }
    //删除 全部
    public static void deleAll(Context mContext){
        SharedPreferences sp=mContext.getSharedPreferences(NAME,mContext.MODE_PRIVATE);//0或者MODE_PRIVATE
        sp.edit().clear().apply();
    }
    

}
  1. 静态变量的封装
public class StaticClass {
    //微信精选key
    public static final String WECHAT_KEY="xxxxxxxxxxxxxxxxxxxxxx";
    //girl key
    public static final String GIRL_KEY="xxxxxxxxxxxxxxxxxxxxxx";
    //讯飞语音key 5ced0430
    public static final String VOICE_KEY="xxxxxxxxxxxxxxxxxxxxxx";
    //短信action
    public static final String SMS_ACTION="xxxxxxxxxxxxxxxxxxxxxx";
    //检测更新
    public static final String 	CHECK_UPDATE_URL="xxxxxxxxxxxxxxxxxxxxxx";
}
  1. Log的封装
public class L {

    //开关
    public static final  boolean DEBUG = true;
    //TAG
    public static final String TAG = "projectName";

    //五个等级  DIWE

    public static void d(String text){
        if(DEBUG){
            Log.d(TAG,text);
        }
    }

    public static void i(String text){
        if(DEBUG){
            Log.i(TAG,text);
        }
    }

    public static void w(String text){
        if(DEBUG){
            Log.w(TAG,text);
        }
    }

    public static void e(String text){
        if(DEBUG){
            Log.e(TAG,text);
        }
    }
}
  1. android属性
  2. Looper,MessageQueue均属于主线程,sendMessage等同于往MessageQueue中添加消息
  3. Java中的四种引用
  4. 项目源码
  5. Looper和Handler的使用
  6. 四大组件:Activity BroadcastReceiver ContentProvider Service
  7. Android 服务两种启动方式的区别
  8. Android之Fragment懒加载分析
    添加链接描述
    什么时候才加载Fragment呢?
    isPrepared (标志Fragment已经初始化完成,在onCreateView中完成初始化 后设置为 true)为true,并且isVisble为true才可以执行基类的load方法(子类重写该方法)
@Override  
    protected void loadData() {  
        if(!isPrepared || !isVisible) {  
            return;  
        }  
        //填充各控件的数据  
    }  
  1. 关键字final

  2. sleep()与wait()区别
    Thread的sleep 方法 让出CPU,不让资源同步锁
    Object的wait方法 让出资源同步锁,当调用notify才可以再次参与资源竞争中。

  3. 读写者

  4. MVP MVC

  5. Android中ANR的监测与定位

lastTimeTick表示上次更新的额数据/timeTick表示这次更新的数据,
线程里执行一次就让lastTimeTick=timeTick,当线程重复第二次运行发现两个相等,也就是timeTick还是得不到执行,则表明UI线程阻塞了。

  1. 两个线程分别打印0-100的之间的奇偶数
  2. String,StringBuffer与StringBuilder的区别
  3. 事件分发
  4. Vector(同步),ArrayList(非同步,不适合插入和删除)两者都是数组的实现,LinkedList是用链表结构(随机访问和遍历速度比较慢)
  5. 滑动冲突及View的事件分发
  6. 获取签名
  7. Android ANR:原理分析及解决办法
  8. 生产者 消费者
  9. 异常处理——finally的特点、作用及面试题
  10. 判断RecyclerView到达底部的方法
  11. 进程,线程

你可能感兴趣的:(Android)