2016-06-28 4 views
1

FLAG_ACTIVITY_NEW_TASKを使用して最初に実行されるサービスを取得することができます。うまくいけば、それはこれを行う正しい方法です。しかし、私はプログラムが完全に始まる前にスプラッシュ画面でサービス()を開始する意図を使用しているので、スプラッシュ画面のイメージが機能し、サービスだけがホーム画面に移動することはできません。Androidアプリのバックグラウンドでサービスを維持する方法

どのようにして動作させることができますか? Serviceを正しく使用していますか?

ご協力いただければ幸いです。ここで私がこれまで持っているものです。

私のサービスクラス:

import android.app.Service; 
import android.content.Intent; 
import android.os.IBinder; 
import android.util.Log; 

public class SpeedManagerService extends Service { 

    private static final String TAG = "SpeedCheckerService"; 

     @Override 
     public void onCreate() { 
      Log.i(TAG, "Service onCreate"); 
     } 

     @Override 
     public int onStartCommand(Intent intent, int flags, int startId) { 
      Log.i(TAG, "Service onStartCommand"); 
      Intent intnt = new Intent(this, SpeedChecker.class); 
      intnt.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      startActivity(intnt); 
      return Service.START_STICKY; 
     } 

     @Override 
     public IBinder onBind(Intent intent) { 
      return null; 
     } 
    } 

これは私のスプラッシュ画面である:

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 

public class SplashActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.splash); 

     /** 
     * Timer set to spend 3 seconds on splash screen then off to main menu 
     */ 
     Thread timerThread = new Thread() { 
      public void run() { 
       try { 
        startService(); 
        sleep(3000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } finally { 
        Intent intent = new Intent(SplashActivity.this, MenuActivity.class); 
        startActivity(intent); 
       } 
      } 
     }; 
     timerThread.start(); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     finish(); 
    } 

    public void startService() { 
     Intent intent = new Intent(this, SpeedManagerService.class); 
     startService(intent); 
    } 
} 

私の全体的なアイデアは、Serviceバックグラウンドで実行し、いつでもそれを持っていることですそれが必要なものに到達すると、通知が発生し、通知がクリックされると、他のクラス(otheractivity.class)の1つに移動します。 もっとコードを投稿する必要がある場合はお知らせください。ありがとう!

+0

SpeedChecker.classがある見ます – Angel

+0

あなたが見ている問題には直接関係していない可能性がありますが、 'Handler'を使って単純な遅延を作成するのではなく'タイマー。 Androidで 'Timer'を使う理由はほとんどありません。 –

+0

実際には、「タイマー」はあなたの問題に関係しているかもしれません。ワーカースレッドで 'startService(Intent)'と 'startActivity(Intent)'を呼び出しています。これらのメソッドは、メインスレッドでのみ呼び出される必要があります。 –

答えて

0

そのようなサービスを開始すると、バックグラウンドではなくメインスレッドにあります。https://developer.android.com/guide/components/services.html を参照してください。他のアクティビティが読み込まれない理由が考えられますバックグラウンドで実行されます(ネットワークアクセスまたはディスクアクセス、またはCPU集約ジョブ)。代わりに、あなたが今何をしているかの

、私はIntentServiceはあなたがはるかに優れてやりたいものは何でも合うだろうと信じている - プラスそのonHandleIntent(意図)がすでにバックグラウンドで実行されている、https://developer.android.com/reference/android/app/IntentService.html

+0

私は私がする必要があると言われているサービスは、いくつかのIntentServiceと言う。大きな違いは何ですか? IntentServiceはなぜ優れているのですか? – Angel

+0

違い! IntentServiceは、クラスServiceのサブクラスです。ただし、startservice()のコードはメインスレッド上で実行されるため、サービスをそのまま使用する場合はバックグラウンドスレッドを作成する必要があります。 IntentServiceクラスでは、onHandleIntent(Intent i)をオーバーライドするだけで、そのメソッドはすでにバックグラウンドで実行されています。クラスサービスを使って自分で実装するよりも便利です。 –

関連する問題