Dialog、Toast和Snackbar
Android检查版本升级 另:版本更新
两次返回键退出
String…和String[]区别
内存泄漏:
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监听器。
PendingIntent在AlarmManager、NotificationManager中的使用(和Intent的区别)
Pattern(格式)与Matcher
android常用工具类封装
Activity、View、Window的理解
null == obj vs obj==null:
在c语言中使用前者可以防止obj=null,但是在java可以说没影响,因为obj=null在if或while中不是boolean,一样会报错。
ProgressDialog使用总结
8.0系统中应用图标的适配
startActivity后,后面的语句还是会继续执行的,finish();后后面的语句也是同样会执行的
通知栏适配
通知渠道:
NotificationChannel channel = new NotificationChannel(channelId, channelName, importance);
NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
notificationManager.createNotificationChannel(channel);
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();
}
}
}
}
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();
}
}
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";
}
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);
}
}
}
@Override
protected void loadData() {
if(!isPrepared || !isVisible) {
return;
}
//填充各控件的数据
}
关键字final
sleep()与wait()区别
Thread的sleep 方法 让出CPU,不让资源同步锁
Object的wait方法 让出资源同步锁,当调用notify才可以再次参与资源竞争中。
读写者
MVP MVC
Android中ANR的监测与定位
lastTimeTick表示上次更新的额数据/timeTick表示这次更新的数据,
线程里执行一次就让lastTimeTick=timeTick,当线程重复第二次运行发现两个相等,也就是timeTick还是得不到执行,则表明UI线程阻塞了。