Android 开发知识点汇总

开发小技巧

  • 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 ~ 120dpildpi
    120dpi ~ 160dpimdpi
    160dpi ~ 240dpihdpi
    240dpi ~ 320dpixhdpi
    320dpi ~ 480dpixxhdpi
    480dpi ~ 640dpixxxhdpi
  • 当使用资源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文件夹下面找到这张图的话,它会认为这张图是为更高密度的设备所设计的,如果直接将这张图在当前设备上使用就有可能会出现像素过高的情况,于是会自动做一个缩小的操作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值