google+android+5.0,Android 5.0+ getRunningTasks is deprecated

本文探讨了如何通过编程获取Android 5.0及以上设备上运行的前台任务列表,并识别哪个应用是真正的Top应用。同时揭示了AppLocker的工作原理,为开发者提供了解决类似问题的思路。

I have gone through this question and this question. But with the help of this library i can now get the list of foreground tasks using following code.

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { //For versions less than lollipop

ActivityManager am = ((ActivityManager) getSystemService(ACTIVITY_SERVICE));

List taskInfo = am.getRunningTasks(5);

top = taskInfo.get(0).topActivity.getPackageName();

Log.v(TAG, "top app = " + top);

}else{ //For versions Lollipop and above

List processes = ProcessManager.getRunningForegroundApps(getApplicationContext());

Collections.sort(processes, new ProcessManager.ProcessComparator());

for (AndroidAppProcess process : processes) {

if (process.foreground) {

top =process.name;

Log.v(TAG,top);

}

}

}

Here, for Android 5.0+, i get all running foreground process but i'm unable to conclude which app is the top app.

Output for above code (for else condition)

com.android.vending

com.google.android.gms

com.google.android.googlequicksearchbox

com.google.android.videos

com.test1

com.naag.testing

com.example.android.gettask

Here my top app is com.google.android.videos

Now how to decide com.google.android.videos is the top app from the above list programmatically?

How does applocker (or similar to applocker) app works on 5.0+?

Hope someone helps which will be helpful for someone.

<think>好的,用户问到了关于`requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS)`被弃用的问题,我需要详细解释这个问题以及解决方法。首先,我需要确认用户可能的使用场景。他们可能是在维护一个旧项目,或者在学习旧的教程时遇到了这个问题。用户可能不太熟悉新的ProgressBar的使用方法,或者不知道如何迁移到新的API。 接下来,我需要回忆一下这个特定的API被弃用的原因。根据Android的更新,`FEATURE_INDETERMINATE_PROGRESS`在API 24后被弃用,可能是因为Google推荐使用更现代的进度指示组件,比如ProgressBar控件,或者支持库中的Material Design组件。原来的方法是在窗口顶部显示一个不确定的进度条,但现在可能有更好的替代方案。 然后,我需要确定用户的实际需求。他们可能在尝试显示一个进度指示器,但遇到了弃用警告,希望知道如何更新代码。用户可能希望保持应用兼容旧版本Android,同时使用新API,因此需要提供兼容性解决方案。 接下来,我需要分步骤解释解决方案。首先,解释为什么这个API被弃用,然后提供替代方法,比如使用Toolbar中的ProgressBar,或者使用Material Design的ProgressIndicator。同时,需要展示如何修改代码,包括XML布局和Java/Kotlin代码的调整。 还需要注意兼容性问题,特别是如果用户的应用需要支持API 24以下的设备。可能需要使用支持库或者条件判断来确保在不同版本上的兼容性。例如,在旧版本中使用旧的API,而在新版本中使用新的方法。 此外,用户可能对如何自定义进度条的外观有疑问,因此需要提到如何通过样式和主题来调整进度条的颜色和样式,以满足设计需求。 最后,总结关键点,确保用户理解迁移的必要性以及新方法的优势,比如更好的用户体验和符合现代设计规范。同时,提醒用户检查依赖项是否更新,以及如何处理可能出现的兼容性问题。</think>--- ### 一、问题背景 您使用的 `requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS)` 已被标记为**过时**(deprecated)。该方法在 Android 7.0(API 24)中被弃用,原因为: 1. **设计规范过时**:传统的标题栏进度条不符合 Material Design 规范。 2. **功能局限性**:无法灵活控制进度条样式和位置。 3. **替代方案优化**:推荐使用更现代化的进度指示组件。 --- ### 二、原代码功能分析 #### 典型使用场景 ```java // 在Activity的onCreate()中调用 requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); setProgressBarIndeterminateVisibility(true); // 显示标题栏进度条 ``` - **用途**:在窗口标题栏显示一个环形不确定进度条(类似旋转圆圈)。 - **问题**:在 API 24+ 设备上会触发弃用警告,且样式无法自定义。 --- ### 三、解决方案:迁移到现代进度指示器 #### 方案1:使用Toolbar + ProgressBar(兼容旧版本) ##### 步骤1:在布局中添加ProgressBar ```xml <!-- res/layout/activity_main.xml --> <androidx.appcompat.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize"> <ProgressBar android:id="@+id/progress_bar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end" android:indeterminate="true" android:visibility="gone" style="@style/Widget.AppCompat.ProgressBar"/> </androidx.appcompat.widget.Toolbar> ``` ##### 步骤2:通过代码控制显示/隐藏 ```java private ProgressBar progressBar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); progressBar = findViewById(R.id.progress_bar); showProgress(true); // 显示进度条 } private void showProgress(boolean show) { progressBar.setVisibility(show ? View.VISIBLE : View.GONE); } ``` #### 方案2:使用Material Design组件(推荐) ##### 步骤1:添加依赖 ```gradle implementation 'com.google.android.material:material:1.9.0' ``` ##### 步骤2:在布局中使用`LinearProgressIndicator` ```xml <com.google.android.material.progressindicator.LinearProgressIndicator android:id="@+id/progress_indicator" android:layout_width="match_parent" android:layout_height="wrap_content" android:indeterminate="true" app:trackColor="@color/gray" app:indicatorColor="@color/blue" app:visibilityMode="ignore" /> ``` ##### 步骤3:通过代码控制 ```java LinearProgressIndicator progressIndicator = findViewById(R.id.progress_indicator); // 显示进度条 progressIndicator.setVisibility(View.VISIBLE); // 隐藏进度条 progressIndicator.setVisibility(View.GONE); ``` --- ### 四、关键改进说明 | 特性 | 旧方法 (`FEATURE_INDETERMINATE_PROGRESS`) | 新方法 (Material Design) | |---------------------|------------------------------------------|------------------------------| | **样式自定义** | 不可修改颜色/大小 | 支持颜色、形状、动画自定义 | | **布局控制** | 固定在标题栏 | 可放置在任何位置 | | **兼容性** | 仅支持旧设备 | 兼容 Android 5.0+ (API 21+) | | **设计规范** | 不符合 Material Design | 符合最新设计规范 | --- ### 五、兼容性处理(针对旧项目) 如果仍需支持 API <24 的旧设备: ```java if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) { requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); setProgressBarIndeterminateVisibility(true); } else { // 使用新方案 findViewById(R.id.progress_indicator).setVisibility(View.VISIBLE); } ``` --- ### 六、附加建议 1. **全屏加载**:对于耗时操作,建议使用全屏进度对话框: ```java ProgressDialog dialog = new ProgressDialog(this); dialog.setMessage("加载中..."); dialog.setIndeterminate(true); dialog.show(); ``` 2. **颜色自定义**:通过主题修改进度条颜色: ```xml <style name="AppTheme" parent="Theme.Material3.Light"> <item name="colorPrimary">@color/blue</item> <item name="colorControlActivated">@color/red</item> </style> ``` --- 通过上述改进,您的代码将符合 Android 最新开发规范,同时获得更好的用户体验和可维护性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值