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开发中常用的一些小技巧”的问题,朋友们可以点击主页了解更多内容,希望可以够帮助大家!
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1296114.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复