Мой очиститель оперативной памяти не работает должным образом, поскольку он не обнаруживает недавно использованные приложения для очистки, хотя при запуске он запрашивает специальный доступ к использованию и предоставляет разрешение фонового процесса уничтожения и статистики использования в Android манифест
я пробовал увеличивать и уменьшать временное окно с 24 часов до 5 минут, но это не работает
вот мой код
package com.example.systemoptimizer6;
import android.annotation.SuppressLint;
import android.app.ActivityManager;
import android.app.usage.UsageStats;
import android.app.usage.UsageStatsManager;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.util.Log;
import java.util.ArrayList;
import java.util.List;
public class RAMCleaner {
private static final String TAG = "RAMCleaner";
private final Context context;
private final PackageManager packageManager;
private final ActivityManager activityManager;
public static class AppInfo {
public final String appName;
public final Drawable appIcon;
public final String packageName;
public AppInfo(String appName, Drawable appIcon, String packageName) {
this.appName = appName;
this.appIcon = appIcon;
this.packageName = packageName;
}
}
public RAMCleaner(Context context) {
this.context = context;
this.packageManager = context.getPackageManager();
this.activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
}
@SuppressLint("ObsoleteSdkInt")
public List getRunningApps() {
List runningApps = new ArrayList();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Log.d(TAG, "Fetching apps using UsageStatsManager...");
runningApps = getAppsFromUsageStats();
}
if (runningApps.isEmpty()) {
Log.d(TAG, "UsageStatsManager returned no apps. Fallback to ActivityManager...");
runningApps = getAppsFromActivityManager();
}
if (runningApps.isEmpty()) {
Log.d(TAG, "No apps detected. Ensure permissions are granted.");
}
return runningApps;
}
private List getAppsFromUsageStats() {
List runningApps = new ArrayList();
UsageStatsManager usageStatsManager = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);
long currentTime = System.currentTimeMillis();
long timeWindow = currentTime - 1000 * 60 * 5; // Last 5 minutes
List usageStatsList = usageStatsManager.queryUsageStats(
UsageStatsManager.INTERVAL_DAILY,
timeWindow,
currentTime
);
if (usageStatsList == null || usageStatsList.isEmpty()) {
Log.d(TAG, "No usage stats available.");
return runningApps;
}
usageStatsList.sort((u1, u2) -> Long.compare(u2.getLastTimeUsed(), u1.getLastTimeUsed()));
for (UsageStats usageStats : usageStatsList) {
String packageName = usageStats.getPackageName();
try {
ApplicationInfo appInfo = packageManager.getApplicationInfo(packageName, 0);
if ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0 && !packageName.equals(context.getPackageName())) {
String appName = packageManager.getApplicationLabel(appInfo).toString();
Drawable appIcon = packageManager.getApplicationIcon(appInfo);
runningApps.add(new AppInfo(appName, appIcon, packageName));
Log.d(TAG, "Detected app: " + appName);
}
} catch (PackageManager.NameNotFoundException e) {
Log.d(TAG, "App not found: " + packageName + ", skipping.");
}
}
return runningApps;
}
private List getAppsFromActivityManager() {
List runningApps = new ArrayList();
List runningProcesses = activityManager.getRunningAppProcesses();
if (runningProcesses == null || runningProcesses.isEmpty()) {
Log.d(TAG, "No running processes found.");
return runningApps;
}
for (ActivityManager.RunningAppProcessInfo processInfo : runningProcesses) {
String packageName = processInfo.processName;
if (processInfo.importance > ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
continue; // Skip non-active apps
}
try {
ApplicationInfo appInfo = packageManager.getApplicationInfo(packageName, 0);
if ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0 && !packageName.equals(context.getPackageName())) {
String appName = packageManager.getApplicationLabel(appInfo).toString();
Drawable appIcon = packageManager.getApplicationIcon(appInfo);
runningApps.add(new AppInfo(appName, appIcon, packageName));
Log.d(TAG, "Detected app (ActivityManager): " + appName);
}
} catch (PackageManager.NameNotFoundException e) {
Log.e(TAG, "App not found: " + packageName, e);
}
}
return runningApps;
}
@SuppressLint("ObsoleteSdkInt")
public void cleanApps(List packageNames) {
for (String packageName : packageNames) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
activityManager.killBackgroundProcesses(packageName);
Log.d(TAG, "Killed background process: " + packageName);
}
}
}
}
package com.example.systemoptimizer6;
import android.animation.ObjectAnimator;
import android.animation.Animator;
import android.annotation.SuppressLint;
import android.app.AppOpsManager;
import android.content.Intent;
import android.os.Bundle;
import android.provider.Settings;
import android.widget.Button;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList;
import java.util.List;
public class RAMCleanerActivity extends AppCompatActivity {
private RAMCleaner ramCleaner;
private ListView listView;
private TextView memoryUsageText;
private TextView reservedRamText;
private ProgressBar ramUsageProgressBar;
private List detectedApps = new ArrayList();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ram_cleaner);
ramCleaner = new RAMCleaner(this);
listView = findViewById(R.id.listView);
memoryUsageText = findViewById(R.id.memoryUsageText);
reservedRamText = findViewById(R.id.reservedRamText);
ramUsageProgressBar = findViewById(R.id.ramUsageProgressBar);
Button cleanButton = findViewById(R.id.cleanButton);
cleanButton.setOnClickListener(v -> cleanSelectedApps());
// Start scanning animation when the activity starts
startScanningAnimation();
}
/**
* Check if Usage Access permission is granted
*/
private boolean hasUsageAccess() {
AppOpsManager appOps = (AppOpsManager) getSystemService(APP_OPS_SERVICE);
int mode = appOps.unsafeCheckOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS,
android.os.Process.myUid(), getPackageName());
return mode == AppOpsManager.MODE_ALLOWED;
}
/**
* Request Usage Access Permission
*/
private void requestUsageAccess() {
Toast.makeText(this, "Grant usage access to detect running apps.", Toast.LENGTH_LONG).show();
Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
//noinspection deprecation
startActivityForResult(intent, 100); // Requesting permission and handle result in onActivityResult
}
/**
* Start scanning animation and invoke app detection after permission is granted
*/
private void startScanningAnimation() {
// First, check if the usage access permission is granted
if (!hasUsageAccess()) {
requestUsageAccess();
return;
}
// Permission granted, start the scanning animation
ramUsageProgressBar.setProgress(0);
ObjectAnimator progressAnimator = ObjectAnimator.ofInt(ramUsageProgressBar, "progress", 0, 100);
progressAnimator.setDuration(3000); // Animation duration: 3 seconds
progressAnimator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {}
@Override
public void onAnimationEnd(Animator animation) {
detectRunningApps(); // Trigger app detection after animation ends
}
@Override
public void onAnimationCancel(Animator animation) {}
@Override
public void onAnimationRepeat(Animator animation) {}
});
progressAnimator.start();
}
/**
* Detect running apps and display them
*/
@SuppressLint("SetTextI18n")
private void detectRunningApps() {
if (!hasUsageAccess()) {
// If permission is still not granted, request it again
requestUsageAccess();
return;
}
detectedApps = ramCleaner.getRunningApps();
if (detectedApps.isEmpty()) {
Toast.makeText(this, "No running apps detected or permission not granted.", Toast.LENGTH_SHORT).show();
} else {
RunningAppsAdapter adapter = new RunningAppsAdapter(this, detectedApps);
listView.setAdapter(adapter);
memoryUsageText.setText("861.5 MB / 2 GB");
reservedRamText.setText("Reserved RAM: 500 MB");
}
}
/**
* Handle result of the permission request (for Usage Access Settings)
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 100) {
// After the user returns from the settings page, check if the permission is granted
if (hasUsageAccess()) {
// Now you can start detecting running apps
startScanningAnimation();
} else {
Toast.makeText(this, "Usage access permission is required to detect running apps.", Toast.LENGTH_SHORT).show();
}
}
}
/**
* Clean selected apps and update UI
*/
private void cleanSelectedApps() {
if (detectedApps.isEmpty()) {
Toast.makeText(this, "No apps to clean.", Toast.LENGTH_SHORT).show();
return;
}
List packageNames = new ArrayList();
for (RAMCleaner.AppInfo app : detectedApps) {
packageNames.add(app.packageName);
}
ramCleaner.cleanApps(packageNames);
Toast.makeText(this, "Stopped " + detectedApps.size() + " apps. Freed 150 MB.", Toast.LENGTH_SHORT).show();
detectedApps.clear();
((RunningAppsAdapter) listView.getAdapter()).notifyDataSetChanged();
}
}
package com.example.systemoptimizer6;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.util.List;
public class RunningAppsAdapter extends ArrayAdapter {
public RunningAppsAdapter(Context context, List runningApps) {
super(context, R.layout.item_running_app, runningApps);
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_running_app, parent, false);
}
RAMCleaner.AppInfo appInfo = getItem(position);
if (appInfo != null) {
TextView appNameText = convertView.findViewById(R.id.appNameText);
ImageView appIcon = convertView.findViewById(R.id.appIcon);
appNameText.setText(appInfo.appName);
appIcon.setImageDrawable(appInfo.appIcon);
}
return convertView;
}
}
Подробнее здесь: https://stackoverflow.com/questions/792 ... ly-running
Почему мое приложение Ram Cleaner для Android не обнаруживает недавно запущенных ⇐ Android
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Почему мое приложение Ram Cleaner для Android не обнаруживает недавно запущенных
Anonymous » » в форуме JAVA - 0 Ответы
- 8 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Почему мое приложение Ram Cleaner для Android не обнаруживает недавно запущенных
Anonymous » » в форуме JAVA - 0 Ответы
- 9 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Почему мое приложение Ram Cleaner для Android не обнаруживает недавно запущенных
Anonymous » » в форуме Android - 0 Ответы
- 6 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Почему мое приложение Ram Cleaner для Android не обнаруживает недавно запущенных
Anonymous » » в форуме JAVA - 0 Ответы
- 6 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Почему мое приложение Ram Cleaner для Android не обнаруживает недавно запущенных
Anonymous » » в форуме Android - 0 Ответы
- 4 Просмотры
-
Последнее сообщение Anonymous
-