2013-07-23 103 views
1

我開發的應用程序的行爲類似於電話警衛,應該在啓動時(或由用戶啓動時)運行並保持運行狀態,直到用戶手動完成。當應用程序啓動時(設備啓動完成後)我使用moveTaskToBack將其隱藏在後臺。約12秒後,我的應用程序停止工作(由我懷疑係統殺死),沒有任何通知,根本沒有日誌(但仍然留在歷史堆棧中)。通過使用日誌的app timer檢查,以及當我通過單擊圖標啓動programm時 - 新實例運行。正如我注意到的,如果我從處理程序執行moveTaskToBack,它甚至延遲了500毫秒 - 應用程序不會被殺死!在星系標籤2(4.1.2)和alcatel上輕觸(2.3.6)進行測試。這裏重現示例代碼:Android - 在啓動時啓動的活動+ moveTaskToBack =殺死

MainActivity

public class MainActivity extends Activity 
{ 
    Timer timerCheck; 
    int ticks = 0; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     timerCheck = new Timer(); 
     timerCheck.schedule(taskCheck, 0, 1000); 

     if (IsStartup()) 
      moveTaskToBack(true); 

//  if (IsStartup()) 
//  { 
//   new Handler().postDelayed(new Runnable() 
//   { 
//    @Override 
//    public void run() 
//    { 
//     moveTaskToBack(true); 
//    } 
//   }, 1000); 
//  } 
    } 

    TimerTask taskCheck = new TimerTask() 
    { 
     @Override 
     public void run() 
     { 
      runOnUiThread(timerTickCheck); 
     } 

     private Runnable timerTickCheck = new Runnable() 
     { 
      public void run() 
      { 
       Log.e("testapp", "alive for " + ++ticks * 1000 + " ms"); 
      } 
     }; 
    }; 

    private boolean IsStartup() 
    { 
     return getIntent().hasExtra("startup"); 
    } 
} 

StartupReceiver

public class StartupReceiver extends BroadcastReceiver 
{ 
    @Override 
    public void onReceive(Context c, Intent i) 
    { 
     Intent in = new Intent(); 
     in.setClassName("com.example.startuptest", 
       "com.example.startuptest.MainActivity"); 
     in.putExtra("startup", "1"); 
     in.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK 
       | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
     c.startActivity(in); 
    } 
} 

清單

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.startuptest" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="17" /> 

     <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 


     <receiver android:name="com.example.startuptest.StartupReceiver" > 
      <intent-filter> 
       <action android:name="android.intent.action.BOOT_COMPLETED" /> 
      </intent-filter> 
     </receiver> 

     <activity 
      android:name="com.example.startuptest.MainActivity" 
      android:label="@string/app_name" 
      android:launchMode="singleTop" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

因此,有我的問題 - 爲什麼Android系統有這樣的行爲?無論如何,立即隱藏啓動應用程序?

回答

0

如果Android操作系統需要它的資源,它可以終止任何後臺進程。在你的情況下,系統啓動是一個非常耗費資源的時期,而後臺活動在保留內容時的優先級很低。 無論如何,如果你想長時間在後臺運行一些東西,我建議你退房服務: http://developer.android.com/guide/components/services.html

+0

所以如果服務是唯一的方式比好吧。但不明白爲什麼小延遲可以防止查殺 – Maxdestroyer