2014-03-13 26 views
1

如果我在一個活動我得先從startService服務:0流程和設置,應用程序在1個服務和運行

1 processes and 1 service 

如果我現在刷那個活動了。 I.e刪除它,我得到:

0 processes and 1 service 

這是爲什麼?什麼是Android世界中的流程和服務?

我使用START_STICKY,如果我通過設置,應用程序和運行停止服務,它不會再次啓動,爲什麼?

UPDATE1一些代碼:

Activity: 
startService(new Intent(getApplicationContext(), MyService.class)); 

Service: 
@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    Log.d(TAG, "Starting service"); 


    return(START_STICKY); 
} 
+0

介紹一些關於你在做什麼的代碼? – zgc7009

+0

@ zgc7009什麼不清楚? – powder366

+0

你確定它的'0進程和1服務'?我認爲只要您的服務正在運行,就必須有一個流程。你刷新了屏幕? – waqaslam

回答

0

原來是KitKat中的一個bug。 (有時候我認爲在Android上完成任何事情是一件很麻煩的事情!)

Android Services: START_STICKY does not work on Kitkat

https://code.google.com/p/android/issues/detail?id=63793

修復的服務:

@Override 
public void onTaskRemoved(Intent rootIntent) { 
    Intent restartService = new Intent(getApplicationContext(), this.getClass()); 
    restartService.setPackage(getPackageName()); 
    PendingIntent restartServicePI = PendingIntent.getService(
     getApplicationContext(), 1, restartService, 
     PendingIntent.FLAG_ONE_SHOT); 
    AlarmManager alarmService = (AlarmManager)getApplicationContext().getSystemService(Context.ALARM_SERVICE); 
    alarmService.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() +1000, restartServicePI); 
} 
+0

這段代碼做了什麼?我試圖從我的服務類每小時後顯示通知有時我得到通知,但點擊通知崩潰我的應用程序,之後,它也停止我的服務,這是否因爲我的應用程序正在從最近的應用程序列表中清除嗎?多數民衆贊成在通知工作,但點擊通知是開放的應用程序,但崩潰的應用程序 – Erum

1

什麼是機器人世界的過程定義是什麼?與任何操作系統中定義的相同 - 從系統的角度來看,您的應用程序是「活着的」,它具有活動內存分配堆棧,並且可以運行或不運行活動,服務等等...

我認爲你掙扎你的「如何可以是運行過程= 0」,但服務= 1不製作場景,,你是對的

從設置應用中顯示運行的應用程序顯示不僅爲開發者所做的,而且對於用戶來說,我想這就是爲什麼大多數廠商決定表演活動任務的過程。基本上,在這個顯示 - 運行過程=正在運行的任務。

大多數應用程序只啓動一個任務(帶有啓動器標誌的主要活動在該模式下自動啓動)。只有在其他活動將以該標誌明確開始時,纔會有更多任務。

因此,如果您的應用程序有2個活動在new task mode開始 - 您會看到「2進程」。

如果您的應用程序沒有運行(您的進程確實無法運行) - 那麼您將不會在運行的應用程序屏幕中看到該應用程序。

+0

更多一點這個過程就是正在運行的應用程序本身,只要應用程序在堆棧上被分配一些空間。服務是在該進程的後臺運行的應用程序的一部分。 – zgc7009

+0

因此,在Activity任務結束後,我應該手動綁定到服務還是應該發出新的startService,一旦應用程序再次啓動?我的問題的第二部分,爲什麼我的服務沒有在手動停止後重新啓動(在我從我的任務列表中刪除活動後,我停止了該服務)? – powder366

+0

很好的解釋+1! – kiruwka

0

你的情況的主要問題是烏拉圭回合無法啓動時,應用程序關閉該服務,到時候Android操作系統將殺死服務,如果您無法重新啓動服務,請致電alam manger以啓動此類接收器,

M anifest是,

  <service 
      android:name=".BackgroundService" 
      android:description="@string/app_name" 
      android:enabled="true" 
      android:label="Notification" /> 
     <receiver android:name="AlarmReceiver"> 
      <intent-filter> 
       <action android:name="REFRESH_THIS" /> 
      </intent-filter> 
     </receiver> 

IN主Activty以這種方式啓動報警馬槽,

String alarm = Context.ALARM_SERVICE; 
     AlarmManager am = (AlarmManager) getSystemService(alarm); 

     Intent intent = new Intent("REFRESH_THIS"); 
     PendingIntent pi = PendingIntent.getBroadcast(this, 123456789, intent, 0); 

     int type = AlarmManager.RTC_WAKEUP; 
     long interval = 1000 * 50; 

     am.setInexactRepeating(type, System.currentTimeMillis(), interval, pi); 

這將調用reciver和reciver是,

public class AlarmReceiver extends BroadcastReceiver { 
    Context context; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     this.context = context; 

     System.out.println("Alarma Reciver Called"); 

     if (isMyServiceRunning(this.context, BackgroundService.class)) { 
      System.out.println("alredy running no need to start again"); 
     } else { 
      Intent background = new Intent(context, BackgroundService.class); 
      context.startService(background); 
     } 
    } 

    public static boolean isMyServiceRunning(Context context, Class<?> serviceClass) { 
     ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); 
     List<ActivityManager.RunningServiceInfo> services = activityManager.getRunningServices(Integer.MAX_VALUE); 

     if (services != null) { 
      for (int i = 0; i < services.size(); i++) { 
       if ((serviceClass.getName()).equals(services.get(i).service.getClassName()) && services.get(i).pid != 0) { 
        return true; 
       } 
      } 
     } 
     return false; 
    } 
} 

這Alaram reciver調用一次,當機器人應用程序被打開,當應用程序關閉.SO服務是這樣的,

public class BackgroundService extends Service { 
    private String LOG_TAG = null; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     LOG_TAG = "app_name"; 
     Log.i(LOG_TAG, "service created"); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     Log.i(LOG_TAG, "In onStartCommand"); 
     //ur actual code 
     return START_STICKY; 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     // Wont be called as service is not bound 
     Log.i(LOG_TAG, "In onBind"); 
     return null; 
    } 

    @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) 
    @Override 
    public void onTaskRemoved(Intent rootIntent) { 
     super.onTaskRemoved(rootIntent); 
     Log.i(LOG_TAG, "In onTaskRemoved"); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     Log.i(LOG_TAG, "In onDestroyed"); 
    } 
} 
相關問題