Android get all processes

Android get all processes

A small Android library to get the current running processes

PLEASE NOTE, THIS PROJECT IS NO LONGER BEING MAINTAINED

Google has significantly restricted access to /proc in Android Nougat. This library will not work on Android 7.0. Please star this issue.

More details can be found at:

What is this library for?

This small library can get a list of running apps and does not require any permissions.

Why would I need this?

Android 5.0+ killed getRunningTasks(int) and getRunningAppProcesses() . Both of these methods are now deprecated and only return the caller’s application process.

Android 5.0 introduced UsageStatsManager which provides access to device usage history and statistics. This API requires the permission android.permission.PACKAGE_USAGE_STATS , which is a system-level permission and will not be granted to third-party apps. However, declaring the permission implies intention to use the API and the user of the device can grant permission through the Settings application.

Get a list of running apps:

  • System apps will not be included on some Android versions because they have a higher SELinux context.
  • This is not a full replacement of getRunningAppProcesses(). The library does not provide a processes’ pkgList, lru, or importance.
  • This is currently not working on the N developer preview.

Download the latest AAR or grab via Gradle:

In 2017 I decompiled the top 150 free apps on Google Play and found numerous apps using this library. Companies using the library include Cheetah Mobile and Baidu. Apps using this library include ES File Explorer, Clean Master, Security Master, CM Launcher 3D, Virus Cleaner by Hi Security, and Super Cleaner. Combined, these apps have at least 1.2 billion downloads!

Источник

Процессы и потоки в Android: пишем AsyncTask правильно

Продолжаю свои повествования об Android. И в этот раз хочу поделиться ценной информацией о процессах и потоках, которая должна быть хорошо усвоена и всегда оставаться под рукой во избежании ошибок и недопонимания при написании приложений. В конце статьи приведу пример реализации AsyncTask, который загружает в ImageView картинку по нажатию на кнопку.

Прежде всего отмечу, что подробнее о данной теме можно прочесть в данном руководстве — developer.android.com/guide/topics/fundamentals/processes-and-threads.html

На заметку о процессах и потоках в Android

Когда запускается компонент приложения и приложение не имеет других запущенных компонентов, Android создает новый процесс для приложения с одним потоком исполнения. По умолчанию все компоненты одного приложения запускаются в одном процессе, в потоке называемом «главный». Если компонент приложения запускается и уже существует процесс для данного приложения(какой-то компонент из приложения существует), тогда компонент запущен в этом процессе и использует его поток выполнения. Вы можете изменить данное поведение, задав разные процессы для разных компонентов вашего приложения. Кроме того вы можете добавить потоки в любой процесс.

Задать отдельный процесс для компонента можно с помощью файла манифеста. Каждый тег компонента(activity, service, receiver и provider) поддерживает атрибут android:process. Данный атрибут позволяет задать процесс, в котором будет выполняться компонент. Также вы можете задать процесс в котором будут выполняться компоненты разных приложений. Также данный атрибут поддерживается тегом application, что позволяет задать определенный процесс для всех компонентов приложения.

Читайте также:  Unity with android support

Android пытается поддерживать процесс приложения как можно дольше, но когда потребуются ресурсы старые процессы будут вытеснены по иерархии важности.

Существует 5 уровней иерархии важности: (процессы первого уровня из списка будут удалены последними)

1.Процесс с которым взаимодействует пользователь(Foreground process)
К таким процессам относится например: активити с которым взаимодействует пользовать; сервис(экземпляр Service), с которым взаимодействует пользователь; сервис запущенный методом startForeground(); сервис, который выполняет один из методов своего жизненного цикла; BroadcastReceiver который выполняет метод onReceive().

2.Видимый процесс
Процесс, в котором не выполнены условия из пункта №1, но который влияет на то, что пользователь видит на экране. К примеру, вызван метод onPause() активити.

3.Сервисный процесс
Служба запущенная методом startService()

4.Фоновый процесс
Процесс выполняемый в фоновом режиме, который невиден пользователю.

Отмечу, что в компонентах приложения существует метод onLowMemory(), но полагаться на то, что данный метод будет вызван нельзя, также как нельзя на 100% полагаться на метод onDestroy(), поэтому логику сохранения данных или каких-либо настроек можно осуществить в методе onStop(), который(как уверяют) точно вызывается.

Когда запускается приложение, система создает «главный» поток выполнения для данного приложения, который также называется UI-потоком. Этот поток очень важен, так как именно в нем происходит отрисовка виджетов(кнопочек, списков), обработка событий вашего приложения. Система не создает отдельный поток для каждого экземпляра компонента. Все компоненты, которые запущенны в одном процессе будут созданы в потоке UI. Библиотека пользовательского интерфейса Android не является потоково-безопасной, поэтому необходимо соблюдать два важных правила:

1) Не блокировать поток UI
2) Не обращаться к компонентам пользовательского интерфейса не из UI-потока

Теперь, предположим, что у нас возникла задача — загрузить картину в ImageView из сети и тут же ее отобразить. Как мы поступим? По логике: мы создадим отдельный поток, который и сделает всю нашу работу, примерно так:

Выглядит правдоподобно, так как мы вынесли операцию загрузки картинки в отдельный поток. Проблема в том, что мы нарушили правило №2. Исправить эту проблему можно с помощью следующих методов:

Activity.runOnUiThread(Runnable)
View.post(Runnable)
View.postDelayed(Runnable, long)

К примеру, воспользуемся первым из них:

Теперь реализация потоково-безопасная: сетевая операция выполняется в отдельном потоке, а к ImageView обращаемся из потока UI.
К счастью, данные операции можно объединить с помощью наследования класса Handler и реализации нужной логики, но лучшее решение — наследовать класс AsyncTask.

AsyncTask позволяет выполнить асинхронную работу и делать обновления пользовательского интерфейса.
Для обновления реализуйте метод onPostExecute(), а всю фоновую работу заключите в метод doInBackground(). После того, как вы реализуете свою собственную задачу, необходимо ее запустить методом execute().

Привожу обещанный пример AsyncTask, в котором реализована задача загрузки и отображения картинки(вариант с аннотациями и отклонением от применения стандартного протокола диалогов):

А теперь рассмотрим самый правильный вариант с точки зрения работы с диалогами:

Кода стало побольше, но лучше использовать стандартный протокол работы с диалогами.
Также я убрал все аннотации, чтобы новичкам было проще попробовать данный код.

Не забудьте добавить в свою разметку кнопочки атрибут с указанным значением: android:onClick=«runButtonHandler»

И добавлю: в оффициальном документе(Тыц ) также, как и в моем случае, не используется preExecute(), но если вам понадобится выполнить какие-то действия с вашим пользовательским интерфейсом до начала выполнения задачи, то смело используйте данный метод.

Читайте также:  Кодек vp9 для android что это такое

Параметры передаваемые в AsyncTask:
1. Параметры(в нашем случае адрес URL).
2. Прогресс (единицы задающие ход изменения задачи). В нашем случае не используется.
3. Результат выполнения задачи(в нашем случае объект Bitmap)

Код довольно прост: всю фоновую работу мы выполняем в методе doInBackGround(), вызывая метод publishProgress(), чтобы во время загрузки картинки крутился наш ProgressDialog при вызове метода onProgressUpdate(). После выполнения фоновой работы вызывается метод onPostExecute() в который передается результат работы метода doInBackGround(), в нашем случае это объект Bitmap и тут же мы его загружаем в ImageView.
Отмечу пару важных моментов, которые нужно учитывать:

1) Метод doInBackGround() выполняется в фоновом потоке, потому доступа к потоку UI внутри данного метода нет.
2) Методы onPostExecute() и onProgressUpdate() выполняются в потоке UI, потому мы можем смело обращаться к нашим компонентам UI.

Да, я снова применил библиотеку android-annotations, так что не пугайтесь аннотациям.

Хочу отметить важность понимания модели работы процессов в Android, чтобы не допустить ошибок при разработке приложений.

Данная статья это переработка доступной информации + личный опыт при реализации указанной задачи и работе с потоками.

Как всегда пожелания и замечания по поводу материала статьи в личку. Если вам есть что-то добавить или дополнить — смело пишите в комментарии.

UPD Статья обновленна добавлением более правильной версии в плане работы с диалогами.

Источник

How to find out which app hogs CPU on your Android

Even though most users are focused on RAM usage, this is, in fact, something that shouldn’t bother you except in extreme cases. What is of bigger importance is CPU activity, as it is a vital factor in device performance, battery consumption, and even overheating. But ways to check on CPU usage on Android are rather scarce. Today, we are going to show you a few ways to check CPU usage on Android, with third-party apps or system resources. Learn more about this below.

It’s important to know that we are here covering system-wide CPU usage as Google prohibits access to hardware usage of apps. So there’s hardly a way you can find out what’s the per-app usage. There are some alternatives, like rooting your device and installing certain modules that overwrite system limitations, but it can be a lot for a regular user to grasp and quite a cumbersome task if you are not sure what exactly you are doing.

Use built-in resources

They are limited but should provide you with a basic insight into the background doings of certain apps. The readings are mostly oriented toward the battery usage, but you can enable the CPU activity toggle. But, firstly, let’s make an important distinction.

For example, if you play demanding, graphically intensive games and your last registered CPU activity is high, that’s OK. However, if idle CPU spikes, you should consider taking some measures concerning third-party apps that work in the background. Limiting or uninstalling them is not the worst of ideas.

If you’re not sure how to enable CPU on your Android device, follow these instructions:

  1. Navigate to Settings.
  2. Open About and navigate to Build number.
  3. Click 7 times on the number to enable Developer options in Settings.
  4. Get back to Settings and open newly unlocked Developer options.
  5. Locate the Monitoring pane below and enable Show CPU usage.
Читайте также:  Hdmi to dvi android

Now, you’ll be informed of the CPU activity in real-time. With that, you should be able to locate and disable certain background apps from hogging on your CPU immensely.

If you’re uncertain how to forcibly disable apps, follow the instructions below:

  1. Open Settings.
  2. Tap Developer options.
  3. Tap Running services or Processes.
  4. Stop suspicious apps.

Have in mind that this is effective only before the restart. With the new restart, there’s a chance that the app process you terminated will emerge again like the phoenix from ashes.

Because of that, you should take into consideration uninstalling the troubling app. Also, if you’re sure that the CPU usage is not showing unusual spikes, you can easily disable the on-screen CPU monitoring and continue using your device just like before.

Use 3rd-party apps

Now, let’s move to a real deal. Most modern smartphones come with built-in maintenance tools. However, most of the time, they’re not properly suited for advanced readings, but rather for the cache cleanup and all kinds of tools that are not of much use. Antivirus apps are not really all that important or useful on Android.

Therefore, the best way to check CPU usage on Android is through specialized third-party apps. Here are the top 3 picks:

Droid Hardware Info

  • Most readings and system information just a few taps away.
  • Access to camera and other sensors for detailed information.
  • A bit limited feature-wise when compared to some other solutions.

You can download Droid Hardware Info, here.

TinyCore

  • Well-designed and small in size as you would expect.
  • It more looks like a built-in tool since it integrates into the system and provides you with readings in real-time.
  • Stats-bar is well placed and informative.
  • Low system footprint.
  • As same as most similar solutions, TinyCore is somehow underwhelming when compared with the premium version, especially when it comes to customization.
  • No advanced readings in the free version.

You can download TinyCore from this link.

CPU-Z

Pros:

  • Probably the best CPU monitoring app you can obtain for free.
  • Mirrors most of the features available on the PC version of the app.
  • Supports most of the available handsets.

Cons:

  • It’s not as attractive visually as some other apps.
  • Too many ads. Including video ads with pop-ups and all that jazz that can drive you mad and diminish the overall experience.

CPU-Z can be downloaded by following this link.

Conclusion

Have in mind that these tools are there just for monitoring. They are just a first step. Once you’ve learned the cause of the CPU spikes, you must manually navigate and terminate and eventually uninstall the CPU-hogging apps.

That should conclude our list and instructions. Thank you for reading and follow us on Twitter and Facebook. We certainly hope that you’ll find those helpful. Also, don’t forget to offer your opinions, questions, or suggestions in the comments section below.

Editor’s note: This article was originally published in May 2019. We made sure to revamp it for freshness and accuracy.

Источник

Оцените статью