蓝桉云顶

Good Luck To You!

Android开发中,有哪些实用的小技巧值得掌握?

Android开发中常用的一些小技巧包括:使用android:attr/selectableItemBackground属性实现点击波纹效果,ViewPager的点击事件写在adapter里,通过android:imeOptions="actionDone"设置输入法完成按钮,给App增加更大的内存配置等。

Android开发中常用的一些小技巧

总述

Android开发过程中,掌握一些实用的小技巧可以显著提升开发效率和代码质量,本文将详细解析这些技巧,包括它们的具体实现方法和使用场景,并提供相应的代码示例、表格以及单元标题格式。

目录

1、Activity管理与日志记录

2、沉浸式状态栏与标题栏设置

3、功能引导的有序管理

4、优化布局变化动画

5、屏蔽快速点击与重复事件

6、判断当前Activity是否已被销毁

7、使用SystemClock.sleep()替代Thread.sleep()

8、线程池的简单使用

9、其他实用小技巧

Activity管理与日志记录

在多Activity的应用中,管理Activity栈及记录当前Activity非常重要,通过创建一个BaseActivity类和ActivityCollector单例类,我们可以方便地实现这些功能。

具体实现步骤:

创建BaseActivity类:

open class BaseActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Log.d("BaseActivity", javaClass.simpleName)
        ActivityCollector.addActivity(this)
    }
    override fun onDestroy() {
        super.onDestroy()
        ActivityCollector.removeActivity(this)
    }
}

创建ActivityCollector单例类:

object ActivityCollector {
    private val activities = ArrayList<Activity>()
    fun addActivity(activity: Activity) {
        activities.add(activity)
    }
    fun removeActivity(activity: Activity) {
        activities.remove(activity)
    }
    fun finishAll() {
        for (activity in activities) {
            if (!activity.isFinishing) {
                activity.finish()
            }
        }
        activities.clear()
    }
}

使用示例:

class FirstActivity : BaseActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.first_layout)
        button1.setOnClickListener { ActivityCollector.finishAll() }
    }
}

为了实现沉浸式体验,可以自定义状态栏和标题栏的颜色与显示方式。

隐藏系统标题栏并设置透明状态栏:

<style name="NotTitleBar" parent="Theme.AppCompat.Light.NoActionBar">
    <!-Customize your theme here -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

在清单文件中应用样式:

<activity android:theme="@style/NotTitleBar"></activity>

Java代码设置透明状态栏:

public static void setStatusBarHide(Window window) {
    if (Build.VERSION.SDK_INT >= 21) {
        View decorView = window.getDecorView();
        decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
        window.setStatusBarColor(Color.TRANSPARENT);
    }
}

设置状态栏颜色:

public static void setStatusBarColor(Window window, Context context, int color) {
    window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
    window.setStatusBarColor(context.getResources().getColor(color));
}

设置状态栏图标颜色为黑色:

private static int getStatusBarLightMode(Window window) {
    int result = 0;
    if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT) {
        if (MIUISetStatusBarLightMode(window, true)) {
            result = 1;
        } else if (FlymeSetStatusBarLightMode(window, true)) {
            result = 2;
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            window.decorView.systemUiVisibility |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
            result = 3;
        }
    }
    return result;
}

功能引导的有序管理

为了避免多个功能引导同时出现影响用户体验,需要有序管理这些引导视图,可以通过GuideManager来实现。

具体实现步骤:

定义引导类型枚举:

enum class GuideType {
    GuideTypeA,
    // ... other guide types
}

创建GuideManager单例类:

object GuideManager {
    private val guideMap = mutableMapOf<Int, GuideModel>()
    fun registerGuide(guideType: GuideType, show: () -> Unit, isShowing: () -> Boolean, hasShown: () -> Boolean, setHasShown: () -> Unit) {
        guideMap[guideType.ordinal] = GuideModel(show, isShowing, hasShown, setHasShown)
    }
    fun show(guideType: GuideType) {
        val guideModel = guideMap[guideType.ordinal] ?: return
        if (guideModel.isShowing() || guideModel.hasShown()) return
        guideMap.forEach { if (it.value.isShowing()) return }
        guideModel.run { show(); setHasShown() }
    }
    fun release() {
        guideMap.clear()
    }
}

使用示例:

object GuideManager {
    fun registerGuide(guideType: GuideType, show: () -> Unit, isShowing: () -> Boolean, hasShown: () -> Boolean, setHasShown: () -> Unit) {
        guideMap[guideType.ordinal] = GuideModel(show, isShowing, hasShown, setHasShown)
    }
}

优化布局变化动画

在布局发生变化时添加动画效果,可以让用户体验更加流畅。

开启系统默认动画效果:

android:animateLayoutChanges="true"

自定义LayoutAnimation:

private fun getAnimationController(): LayoutAnimationController {
    val duration = 180 // 动画时长
    val set = AnimationSet(true)
    val animation = AlphaAnimation(0.0f, 1.0f)
    animation.duration = duration
    set.addAnimation(animation)
    val translateAnimation = TranslateAnimation(Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, -1.0f, Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 0.0f)
    translateAnimation.duration = duration
    set.addAnimation(translateAnimation)
    val controller = LayoutAnimationController(set, 0.5f)
    controller.order = LayoutAnimationController.ORDER_NORMAL
    return controller
}

设置LayoutAnimation:

view.layoutAnimation = getAnimationController()
view.startLayoutAnimation()

屏蔽快速点击与重复事件

为了防止用户快速点击或重复触发事件,可以使用以下方法来屏蔽这些操作。

屏蔽快速重复操作事件:

private var lastTime = 0L
private val minDelayTime = 1000 // 最小间隔时间
fun isQuickOperating(): Boolean {
    val currentTime = System.currentTimeMillis()
    return if (currentTime lastTime >= minDelayTime) {
        lastTime = currentTime
        false
    } else {
        true
    }
}

使用示例:

button.setOnClickListener {
    if (!isQuickOperating()) {
        // 执行点击事件逻辑
    }
}

6. 判断当前Activity是否已被销毁

在进行网络请求或其他异步操作时,需要确保当前Activity未被销毁,以避免异常。

判断Activity是否已销毁:

if (this.isFinishing || this.isDestroyed) {
    return
}

使用示例:

override fun onResume() {
    super.onResume()
    // 开始网络请求或其他异步操作
}

在网络回调中判断:

if (this.isFinishing || this.isDestroyed) {
    return
}
// 更新UI或其他操作

7. 使用SystemClock.sleep()替代Thread.sleep()

在某些情况下,使用SystemClock.sleep()Thread.sleep()更合适,因为它不会立即抛出InterruptedException

使用示例:

val startTime = SystemClock.uptimeMillis()
val endTime = startTime + 1000 // 休眠1秒后的时间点
while (SystemClock.uptimeMillis() < endTime) {
    // do nothing, just wait
}

对比Thread.sleep():

try {
    Thread.sleep(1000); // 休眠1秒
} catch (InterruptedException e) {
    e.printStackTrace();
}

优点:SystemClock.sleep()不会抛出InterruptedException,适用于简单的延迟操作。

缺点: 无法被中断,不适用于需要响应中断的场景。

根据具体需求选择合适的方法。SystemClock.sleep()适合简单的延迟操作,而Thread.sleep()则更适合需要处理中断的情况。

建议: 如果只是简单地让当前线程暂停一段时间,并且不需要处理中断,推荐使用SystemClock.sleep();如果需要能够响应中断,则应使用Thread.sleep(),对于复杂的延时逻辑,可以考虑使用更高级的并发工具,如ScheduledExecutorService等,无论选择哪种方式,都应注意避免在主线程中使用长时间的休眠,以免导致应用程序无响应,也要考虑到不同设备的性能差异,合理设置休眠时间,还可以结合其他同步机制(如信号量、条件变量等)来实现更复杂的线程协调需求,不要忘记在必要时进行性能测试,以确保所选方案对应用的整体性能影响可控,通过合理选择和使用不同的休眠方法,可以更好地控制线程执行流程,提高应用程序的稳定性和响应速度。

以上就是关于“Android开发中常用的一些小技巧”的问题,朋友们可以点击主页了解更多内容,希望可以够帮助大家!

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

«    2024年12月    »
1
2345678
9101112131415
16171819202122
23242526272829
3031
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
搜索
最新留言
文章归档
网站收藏
友情链接