2016-06-18 9 views
1

私は最近、サービスを勉強していて、それを実験しています。私は音楽プレーヤーを作るつもりはありませんが、サービスの仕組みについて学ぶだけです。それで私が何をやっているのか説明しましょう。メインプロセスが停止したときにサービスが破壊されるのはなぜですか?

私のアプリケーションは、私が

@Override 
public void onCreate() 
{ 
    mediaPlayer=MediaPlayer.create(this,R.raw.serenity); 
} 
@Override 
public int onStartCommand(Intent intent, int flags, int startId) 
{ 
    mediaPlayer.start(); 
    return 0; 
} 

を持っているServiceクラスを拡張1 Activityと1 Serviceを持っていると私MainActivityのクラスで私は

startService(intent); 

により、メインスレッドでServiceを開始午前また、属性を追加しました

<service 
     android:name=".MusicService" 
     android:process=":music"/> 

別のプロセスでサービスを実行する。今私は、アクティビティクラスのボタンを使ってサービスを開始すると、サービスが音楽を再生し始めますが、私が戻るボタンを押すとアクティビティが破棄され、音楽はまだ再生されますが、私が望むものは再生しますが、その後、音楽は止まり、最初から始まります。なぜこれが起こっているのか教えてください。私は音楽の停止を望んでいない、私はそれがちょうどアプリケーションの活動やプロセスから独立して再生したい。

+0

マニフェストから 'android:process =":music "を削除してみてください。 –

答えて

2

サービスが現在onCreate()、onStartCommand()、またはonDestroy()メソッドでコードを実行している場合、ホスティングプロセスはこのコードが強制終了されることなく確実に実行できるフォアグラウンドプロセスになります。

参照:

https://developer.android.com/reference/android/app/Service.html#ServiceLifecycle

私はこの事を知っているが、私の質問は、私が更新ムービーからアプリケーションをクリアしていたときに(onStartCommand実行言ったように)フォアグラウンド・プロセスであることが、それが停止してきているということです一度停止して最初からやり直してください。 - Dushyant Suthar 14時間前

    • リターンSTART_STICKYクラッシュ/クローズ
    • 上のサービスを再作成し、startForeground(int型、通知)を使用したいと。

例を示しているとおり

@Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     // log start 
     logger.info(getServiceName(), " Service: start id " + startId + ": " + intent); 
     /** set foreground */ 
     setForeground(); 
     /** run until explicitly stopped. */ 
     return START_STICKY; 
    } 


    private setForeground() { 
     Intent intent = new Intent(this, NotStickyActivity.class); 
     intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
     PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0); 
     Notification noti = new, Notification.Builder(getApplicationContext()) 
       .setContentTitle("Pratikk") 
       .setContentText("Subject") 
       .setSmallIcon(R.drawable.ic_launcher) 
       .setContentIntent(pendingIntent) 
       .build(); 

     startForeground(1234, noti);  
    } 
    • コード&使用ベースを介し
    • マニフェスト開始サービスにサービスを有効にしませんコンテキスト(アクティビティではない - リークしたサービスの例外を受けるため)
    • あなたはまた、有効開始/例
  • 活動からのサービスにバインダー&バインドを提供することができます:その問題があるので

     /** 
        * This method enables the Component (Receiver/Service) registered i 
        * n the AndroidManifest file. 
        */ 
        public static void enableComponent(Context context, Class<?> componentClass) { 
         getLogger().debug("Enabling component {} request from {}", componentClass.getName(), StackTraceInfo.getInvokingClassName()); 
    
         ComponentName receiver; 
         receiver = new ComponentName(context, componentClass); 
         PackageManager pm = context.getPackageManager(); 
    
         pm.setComponentEnabledSetting(receiver, 
           PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 
           PackageManager.DONT_KILL_APP); 
        } 
    
        /** 
        * start a service 
        * 
        * @param context  - context to start service 
        * @param serviceClass - service class to start 
        * @return If the service is being started or is already running, the 
        * {@link ComponentName} of the actual service that was started is 
        * returned; else if the service does not exist null is returned. 
        */ 
        public static ComponentName startService(Context context, Class<?> serviceClass) { 
         getLogger().info("Starting service {} by {}", serviceClass.getName(), StackTraceInfo.getInvokingClassName()); 
         Intent serviceIntent = new Intent(context, serviceClass); 
         return context.startService(serviceIntent); 
        } 
    

    うん弟を、私は私のサービスフォアグラウンドを作るために管理しましたあなたが言ったように、そしてまたdoccumentationsは、システムがonStartCommand()を実行しているときに、フォアグラウンドとして扱われると言っていますが、私がそれをクリアするときあなたが知っているように、それは殺されています。私は、システムがフォアグラウンドとして扱うことと、フォアグラウンドとして扱うことの違いを理解していません。 - Dushyant Suthar

    フォアグラウンドサービスは、ユーザーがメモリ上の低殺すためにシステムの候補の積極的な意識であり、したがってない何かであると考えられていたサービスです。

    フォアグラウンドサービスは、「継続的に」サービスが停止またはフォアグラウンドから削除されるかしない限り、通知が棄却できないことを意味し、見出しの下に配置され、ステータスバー、通知のためのを提供する必要があります。

    +0

    私はこのことを知っていますが、私の質問は、あなたが 'onStartCommand()'を実行していると言っている前景プロセスですが、アプリケーションを 'recents'から一旦停止してから始めからやり直すと停止してしまいます。 –

    +0

    @DushyantSuthar - 私の編集を参照してください – ceph3us

    +0

    兄さん、私は問題を解決するために私のサービスの前景を作ることができましたが、あなたが言ったように、またドキュメントシステムは 'onStartCommand()'を実行すると、あなたが知っているように、私はそれを消してからそれを殺しています。私は、「システムは前景として扱う」と「前景として扱う」との違いを理解していない。 –

    0

    サービスをより安定させるには、フォアグラウンドサービスを作成する必要があります。これはあなたのメインプロセスが停止するたびにサービスを停止させません。私は同様の問題に直面していました。私のプロセスでは、メインプロセスを停止したときに再びkillされ、再起動されました。これを避けるため、前景サービスを使用しました。以下のリンクを使用すると、フォアグラウンドプロセスを簡単に実装して理解できるようになります。お役に立てれば。 Android-foreground service example

    +0

    サービスフォアグラウンドで問題を解決しましたが、 @ ceph3usによって与えられた答えの –

    関連する問題