Почему мое приложение Ram Cleaner для Android не обнаруживает недавно запущенныхAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Почему мое приложение Ram Cleaner для Android не обнаруживает недавно запущенных

Сообщение Anonymous »

Мое приложение для очистки оперативной памяти Android не работает должным образом, поскольку оно не обнаруживает недавно использованные приложения для их очистки, хотя при запуске оно сначала запрашивает специальный доступ к использованию, а затем сканирует недавно использованные приложения по порядку. чтобы очистить их из ОЗУ. Я включил фоновый процесс уничтожения и разрешение на статистику использования в файле манифеста 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Почему мое приложение Ram Cleaner для Android не обнаруживает недавно запущенных
    Anonymous » » в форуме JAVA
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous
  • Почему мое приложение Ram Cleaner для Android не обнаруживает недавно запущенных
    Anonymous » » в форуме Android
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous
  • Почему мое приложение Ram Cleaner для Android не обнаруживает недавно запущенных
    Anonymous » » в форуме JAVA
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Почему мое приложение Ram Cleaner для Android не обнаруживает недавно запущенных
    Anonymous » » в форуме JAVA
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous
  • Почему мое приложение Ram Cleaner для Android не обнаруживает недавно запущенных
    Anonymous » » в форуме Android
    0 Ответы
    4 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Android»