Верхняя часть оболочки 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

Даже когда мое приложение остается в фоновом режиме, почему topPCY говорит '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, Это не значит, что процесс запущен на переднем плане.

Другие вопросы по тегам