2015-09-21 41 views
1

我有Android應用程序與某些服務綁定到某個進程。adb shell頂部顯示我的應用程序在前臺,但實際上它在後臺

我發現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

我甚至在前臺

編輯2

停止從設置的通知,但仍 process=":myService

sources

if (p == SP_BACKGROUND) 
     strcpy(proc->policy, "bg"); 
    else if (p == SP_FOREGROUND) 
     strcpy(proc->policy, "fg"); 
    else 
     strcpy(proc->policy, "er"); 

Answer in other question

晴,沒有受過教育,有些隨機刺,在這黑暗的PCY -

PCY - 政策 - 確定Android應用程序的處理方式 內存管理器

FG - Foreground - Process被認爲是一個foreg輪 過程,並且不應當被殺死以釋放存儲器

BG - 背景 - 過程被認爲是一個後臺進程(在 前景不主動運行,並且可以被殺死以釋放存儲器)

+0

@PaulRatazzi,我正在考慮將它標記爲一段時間。但是,在與「PCY」專欄有關的特定部分,鏈接的答案並不準確,所以我決定反對。 –

+0

同意。我刪除了國旗。 –

回答

3

要闡述亞歷克斯P.的回答是:

相信PCY列指的是處理分配給cgroup。 Android定義了兩個cgroup組,SP_FOREGROUNDSP_BACKGROUNDSP_BACKGROUND的實際cgroup名稱爲bg_non_interactive。這些組分別在top中用縮寫fgbg表示。

你可以找到整個框架,特別是在Process.javaIPCThreadState.cppandroid_util_Process.cpp與Linux的文件系統/proc接口來管理正在運行的進程的各個方面本機代碼到這些引用。根據這些文件中的源代碼評論,似乎前景cgroup中的所有線程都安排了CPU的「正常」份額,而後臺cgroup中的所有線程都安排了「減少」份額。

至於正常和減少的定義,this博客指出SP_BACKGROUND線程限制爲5%的CPU使用率。您可以通過在正在運行的設備上查找/dev/cpuctl/bg_non_interactive/cpu.shares來確認此情況。在我的Nexus 5上運行AOSP 5.1,我得到:

[email protected]:/ # cat /dev/cpuctl/bg_non_interactive/cpu.shares    
52 
[email protected]:/ # 

在這裏,52指的是在cgroup允許線程,出最多1024萬股的「CPU份額」的數量。因此在這種情況下,bg_non_interactive線程確實允許組中所有線程的總CPU使用率最高約爲5%。

在任何情況下,很明顯前景和背景在這方面與Android的Activity lifecycle以及前景和後臺應用的想法無關。這只是Android利用Linux的cgroups工具的方式。

+0

謝謝保羅,這讓我的理解更加清晰 – snaggs

2

PCY代表scheduling policy。該列中的fg表示該進程得到比bg更高的優先級。這並不意味着這個過程在前臺運行。

+0

謝謝,你的回答和@ Paul的意思是有道理的 – snaggs

相關問題