开发小技巧
Android Studio
log 快捷输入- 输入
logv/logd/logi/logw/loge
,按下Tab
键,自动补全一条完整的打印语句,包含TAG
和当前函数名 - 在所有函数外输入
logt
,按下Tab
键,会以当前的类名作为值自动生成一个TAG
常量
- 输入
Android Studio
快速添加Override Methods
- Ctrl + O
- release 库的时候隐藏log
-
Android
#define LOG_TAG "YOUR_TAG" #define LOG_ENABLE 0 #if LOG_ENABLE #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__) #else #define LOGD(...) NULL #endif
-
Windows
#define _DEBUG_ 1 #if _DEBUG_ #define print_log(...) printf(__VA_ARGS__) #else #define print_log(...) #endif
-
- 不同位数下适配long的使用
#if defined(__LP64__) LOGD("long typte variable,value = %ld", value); #else LOGD("long typte variable,value = %lld", value); #endif
Android知晓当前是在哪一个活动
- 新建一个
BaseActivity
类,这里BaseActivity
和普通活动的创建方式不一样,因为不需要在AndroidManifest.xml
中注册,所以选择创建一个普通的java class
即可 - 然后让
BaseActivity
继承自AppCompatActivity
,并重写onCreate
方法 - 在
onCreate
中获取当前实例的类名,并通过log打印出来 - 最后让
BaseActivity
成为其他所有活动的父类,因为其继承自AppCompatActivity
,所以不影响其他活动的功能public class BaseActivity extends AppCompatActivity { private static final String TAG = "BaseActivity"; @Override public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) { super.onCreate(savedInstanceState, persistentState); Log.d(TAG, "onCreate: " + getClass().getSimpleName()); } }
Android随时随地退出程序
- 用一个专门的集合类对所有活动进行管理
public class ActivityCollector { private static final String TAG = "ActivityCollector"; public static List<Activity> activities = new ArrayList<>(); 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(); } } android.os.Process.killProcess(android.os.Process.myPid()); } }
- 在上述所有活动的父类
BaseActivity
中添加代码public class BaseActivity extends AppCompatActivity { private static final String TAG = "BaseActivity"; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); ActivityCollector.addActivity(this); } @Override protected void onDestroy() { super.onDestroy(); Log.d(TAG, "onDestroy: "); ActivityCollector.removeActivity(this); } }
- 在需要直接退出程序的地方直接调用
ActivityCollector.finishAll();
获取手机屏幕密度
float xdpi = getResources().getDisplayMetrics().xdpi;
float ydpi = getResources().getDisplayMetrics().ydpi;
-
xdpi代表屏幕宽度的dpi值,ydpi代表屏幕高度的dpi值,通常这两个值都是近乎相等或者极其接近的,当只有一张图的时候,将图放入对应的目录
dpi范围 密度 0dpi ~ 120dpi ldpi 120dpi ~ 160dpi mdpi 160dpi ~ 240dpi hdpi 240dpi ~ 320dpi xhdpi 320dpi ~ 480dpi xxhdpi 480dpi ~ 640dpi xxxhdpi -
当使用资源id去引用一张图片时,Android会使用一些规则来去帮助匹配最适合的图片。比如手机屏幕密度是xxhdpi,那么drawable-xxhdpi文件夹下的图片就是最适合的图片。因此当引用某张图时,如果drawable-xxhdpi文件夹下有这张图就会优先被使用,在这种情况下,图片是不会被缩放的。但是,如果drawable-xxhdpi文件夹下没有这张图时, 系统就会自动去其它文件夹下找这张图,优先会去更高密度的文件夹下寻找
-
若当前的场景需要drawable-xxxhdpi文件夹中的图,发现这里没有,接下来会尝试再找更高密度的文件夹,发现没有更高密度的了,这个时候会去drawable-nodpi文件夹找这张图,发现也没有,那么就会去更低密度的文件夹下面找,依次是drawable-xhdpi -> drawable-hdpi -> drawable-mdpi -> drawable-ldpi。
-
总体匹配规则就是这样,那么比如说现在终于在drawable-mdpi文件夹下面找到这张图了,但是系统会认为这张图是专门为低密度的设备所设计的,如果直接将这张图在当前的高密度设备上使用就有可能会出现像素过低的情况,于是系统自动做了一个放大操作
-
同样的道理,如果系统是在drawable-xxxhdpi文件夹下面找到这张图的话,它会认为这张图是为更高密度的设备所设计的,如果直接将这张图在当前设备上使用就有可能会出现像素过高的情况,于是会自动做一个缩小的操作