Верхняя часть оболочки adb показывает мое приложение на переднем плане, но на самом деле оно в фоновом режиме
У меня есть приложение для Android с некоторыми службами, связанными с каким-либо процессом.
я нашел это adb shell top -n 1
возвращает:
PID PR CPU% S #THR VSS RSS PCY UID Name
31647 0 1% S 70 1733640K 98960K bg u0_a132 com.my.app.dev
31727 0 1% S 29 1523892K 62924K fg u0_a132 com.my.app.dev:myService
Даже когда мое приложение остается в фоновом режиме, почему top
PCY
говорит 'fg'
передний план?
Может кто-нибудь распространить свет по этому вопросу?
Это мой Manifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.my.app.dev"
android:versionName="4.0.1.6700000"
android:versionCode="5033" >
<uses-sdk android:minSdkVersion="10"
android:targetSdkVersion="16" />
<application android:icon="@drawable/icon"
android:label="@string/config_app_name"
android:theme="@style/Theme.NoActionBarAppCompat"
android:name="com.my.app.Mine" >
<!-- we would prefer the launchMode to be standard, but it causes a lot of problems. -->
<activity android:name="com.my.ui.main.MineApp"
android:label="@string/config_app_name"
android:launchMode="singleTask"
android:clearTaskOnLaunch="true"
android:theme="@style/Theme.Translucent.NoActionBarAppCompat" >
<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
<action android:name="mine.action.HomeActivity" />
<category android:name="android.intent.category.LAUNCHER" />
<action android:name="android.intent.action.MAIN" />
</intent-filter>
</activity>
<meta-data android:name="com.google.android.maps.v2.API_KEY"
android:value="xxxxxx" />
<meta-data android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
<uses-library android:name="com.google.android.maps" />
<service android:name="com.my.engine.logic.EngineService"
android:process=":myService">
<intent-filter>
<action android:name="com_my_RemoteService" />
<action android:name="com_my_EngineService" />
</intent-filter>
</service>
<receiver
android:name="com.my.engine.analytics.ReferrerReceiver"
android:exported="true" android:process=":myService">
<intent-filter>
<action
android:name="com.android.vending.INSTALL_REFERRER"/>
</intent-filter>
</receiver>
<receiver
android:name="com.my.engine.BootBroadcastReceiver"
android:process=":myService">
<intent-filter>
<action
android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
<receiver
android:name="com.my.engine.util.MineWatcherReceiver"
android:process=":myServiceWatcher">
<intent-filter>
<action
android:name="android.intent.action.ACTION_POWER_CONNECTED" />
<action
android:name="android.intent.action.BATTERY_OKAY" />
<action
android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action
android:name="android.intent.action.USER_PRESENT" />
</intent-filter>
</receiver>
<receiver
android:name="com.my.engine.logic.InitServiceReceiver"
android:exported="true" android:process=":myService">
<intent-filter>
<action android:name="initServiceCheck"/>
</intent-filter>
</receiver>
<receiver
android:name="com.my.engine.logic.UpdateCounterReceiver"
android:exported="true" android:process=":myService">
<intent-filter>
<action android:name="updateCustomCounter"/>
</intent-filter>
</receiver>
<receiver
android:name="com.my.engine.logic.PackageChangeReceiver"
android:process=":myService">
<intent-filter>
<action
android:name="android.intent.action.PACKAGE_ADDED"/>
<action
android:name="android.intent.action.PACKAGE_REPLACED"/>
<action
android:name="android.intent.action.PACKAGE_REMOVED"/>
<action
android:name="android.intent.action.PACKAGE_INSTALL"/>
<data android:scheme="package"/>
</intent-filter>
</receiver>
<!-- for notification try next action -->
<service android:name="com.my.notifications.actions.TryNextNotificationActionService" />
<receiver android:name="com.my.ui.base.EulaReminderReceiver">
<intent-filter>
<action android:name="eulaReminderAction" />
</intent-filter>
</receiver>
<receiver android:name="com.my.ui.base.MineGuiBroadcastReceiver">
<intent-filter>
<action android:name="finishStoppedActivities" />
</intent-filter>
</receiver>
<service android:name="com.my.infra.motion.ActivityRecognitionService"
android:label="ActivityRecognitionService"
android:exported="true"
android:enabled="true"
android:process=":myService">
</service>
</application>
</manifest>
Редактировать 1
Я даже остановил уведомления из настроек, но все же process=":myService
на переднем плане
Редактировать 2
из источников:
if (p == SP_BACKGROUND)
strcpy(proc->policy, "bg");
else if (p == SP_FOREGROUND)
strcpy(proc->policy, "fg");
else
strcpy(proc->policy, "er");
Главным образом необразованный, несколько случайный удар в темноте для PCY -
PCY - Policy - определяет, как приложение должно обрабатываться диспетчером памяти Android.
FG - Foreground - Процесс считается процессом переднего плана и не должен быть уничтожен для освобождения памяти
BG - Background - Процесс считается фоновым процессом (не активно запущен на переднем плане и может быть уничтожен для освобождения памяти)
2 ответа
Чтобы уточнить ответ Алекса П.:
Я считаю, что колонка PCY относится к cgroup
что процесс назначен. Android определяет два cgroup
группы, SP_FOREGROUND
а также SP_BACKGROUND
, Настоящий cgroup
имя для SP_BACKGROUND
является bg_non_interactive
, Эти группы указаны в top
с сокращениями fg
а также bg
соответственно.
Вы можете найти ссылки на них в рамках Framework, особенно в Process.java
, IPCThreadState.cpp
и нативный код в android_util_Process.cpp
который взаимодействует с Linux /proc
файловая система для управления различными аспектами запущенных процессов. Согласно комментариям исходного кода в этих файлах, кажется, что все потоки на переднем плане cgroup
запланированы с "нормальной" долей процессора, в то время как в фоновом режиме cgroup
запланированы с уменьшенной долей.
Что касается определений нормальных и редуцированных, этот блог утверждает, что SP_BACKGROUND
потоки ограничены 5% загрузкой процессора. Вы можете подтвердить это, посмотрев в /dev/cpuctl/bg_non_interactive/cpu.shares
на вашем работающем устройстве. На моем Nexus 5 под управлением AOSP 5.1 я получаю:
root@hammerhead:/ # cat /dev/cpuctl/bg_non_interactive/cpu.shares
52
root@hammerhead:/ #
Здесь 52 относится к числу "долей ЦП", разрешенных для потоков в cgroup
из максимум 1024 акций. Так что в этом случае bg_non_interactive
потокам действительно разрешено максимальное использование процессора ~5% для всех потоков в группе.
В любом случае очевидно, что передний план и фон в этом контексте имеют мало общего с жизненным циклом Android- активности и идеей приложений переднего плана и фона. Это просто способ, которым Android использует Linux cgroups
объект.
PCY
обозначает scheduling policy
, fg
в этом столбце означает, что процесс получает более высокий приоритет, чем bg
, Это не значит, что процесс запущен на переднем плане.