-1

AndroidのIntentServiceとServiceの違いを知るために、以下のようにIntentServiceクラスの小さなテストを作成しました。 IntentServiceクラスは、 startService(intent);を使用して開始することができ、結果としてnStartCommand(Intent intent、int flags、int startId)が呼び出されます。また、例えばMainActivity にIntentServiceクラスから値を送信するために、我々はsendBroadcast(intent);経由で送信する必要があり、それは私がこれまでサービスとIntentServiceの違い

sendBroadcast(intent); 

を経由して送信された値を受け取ることができるようにMainActivityは、そのアクションのbroadcastReceiverを登録する必要がありますサービスとIntentServiceの相違を見ることはできません!!彼らはそれらを開始する方法とデータをブロードキャストする方法で似ているので、あなたは でそれらがどのような文脈で教えてくれますか?要するに

public class MyIntentService extends IntentService { 

private final String TAG = this.getClass().getSimpleName(); 
public final static String INTENT_ACTION = "ACTION_VALUE_SENT"; 
public final static String INTENT_KEY = "INTENT_KEY"; 

public MyIntentService() { 
    super(null); 
} 

/** 
* Creates an IntentService. Invoked by your subclass's constructor. 
* 
* @param name Used to name the worker thread, important only for debugging. 
*/ 
public MyIntentService(String name) { 
    super(name); 
    setIntentRedelivery(true); 
} 

@Override 
public void onCreate() { 
    super.onCreate(); 
    Log.w(TAG, SubTag.msg("onCreate")); 
} 

@Override 
protected void onHandleIntent(Intent intent) { 
    Log.w(TAG, SubTag.msg("onHandleIntent")); 

    int intent_value = intent.getIntExtra("intent_key", -1); 
    Log.i(TAG, SubTag.bullet("", "intent_value: " + intent_value)); 

    Intent intent2 = new Intent(); 
    intent2.setAction(MyIntentService.INTENT_ACTION); 
    intent2.putExtra(MyIntentService.INTENT_KEY, intent_value); 
    sendBroadcast(intent2); 

    SystemClock.sleep(3000); 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    Log.w(TAG, SubTag.msg("onStartCommand")); 

    return super.onStartCommand(intent, flags, startId); 
} 
+0

主な違いを参照してください。そして、IntentServiceはバックグラウンドスレッドで作業しています – xAqweRx

答えて

0

、サービスは次のとおりです。

私はこれらのエラーを受信し、どのように

MainActivity

public class MainActivity extends AppCompatActivity { 

    private final String TAG = this.getClass().getSimpleName(); 

    private Button mbtnSend = null; 
    private int i = 0; 

    private BroadcastReceiver mBCR_VALUE_SENT = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      String action = intent.getAction(); 

      if (action.equals(MyIntentService.INTENT_ACTION)) { 
       int intnetValue = intent.getIntExtra(MyIntentService.INTENT_KEY, -1); 
       Log.i(TAG, SubTag.bullet("mBCR_VALUE_SENT", "intnetValue: " + intnetValue)); 
      } 
     } 
    }; 


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

     registerReceiver(this.mBCR_VALUE_SENT, new IntentFilter(MyIntentService.INTENT_ACTION)); 

     this.mbtnSend = (Button) findViewById(R.id.btn_send); 
     this.mbtnSend.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent intent = new Intent(getApplicationContext(), MyIntentService.class); 
       intent.putExtra("intent_key", ++i); 
       startService(intent); 
      } 
     }); 
    } 
} 

MyIntentServiceそれを解決することになっている理由を教えてください開発者がバックグラウンド操作をセットアップするための広範な実装。 IntentServiceは、スレッド作成とクリーンアップのバックグラウンドを処理して、「ファイアアンドファー」操作に役立ちます。ドキュメントから

サービスAサービスは、ユーザとの対話または他のアプリケーションが使用するための機能を提供しないようにしながら、より長いランニング動作を実行するためのいずれかのアプリケーションの要望を表すアプリケーション・コンポーネントです。

IntentServiceサービスは、オンデマンドで非同期リクエスト(インテントとして表示)を処理するIntentServiceサービスの基本クラスです。クライアントはstartService(インテント)コールを通じて要求を送信します。必要に応じてサービスが開始され、ワー​​カースレッドを使用して各インテントが順番に処理され、作業が終了するとサービスが停止します。

は、このドキュメントを参照してください - http://developer.android.com/reference/android/app/IntentService.html

0

サービス

これは、すべてのサービスの基本クラスです。このクラスを拡張するときは、アプリケーションが実行しているすべてのアクティビティのパフォーマンスを低下させる可能性があるデフォルトでは、サービスがアプリケーションのメインスレッドを使用するため、すべてのサービスの作業を行う新しいスレッドを作成することが重要です。

IntentService

これは、すべての起動要求を1つずつ処理するためのワーカースレッドを使用してサービスのサブクラスです。これは、サービスが複数の要求を同時に処理する必要がない場合に最適なオプションです。あなたがする必要があるのは、onHandleIntent()を実装することです。これはバックグラウンド作業を行うことができるように、各開始要求のインテントを受け取ります。

以下はAndroidのサービスとIntentServiceの主な違いです。

1)いつ使用しますか?

サービスはUIを持たないタスクでも使用できますが、長すぎることはできません。長いタスクを実行する必要がある場合は、Service内でスレッドを使用する必要があります。

IntentServiceは、通常、メインスレッドと通信しない長いタスクで使用できます。通信が必要な場合は、メインスレッドハンドラまたはブロードキャストインテントを使用できます。使用のもう1つのケースは、コールバックが必要な場合です(Intent triggered tasks)。

2)どのようにトリガーするのですか?

サービスは、メソッドonStartService()を呼び出してトリガーされます。

Intentを使用してIntentServiceがトリガされ、新しいワーカースレッドが生成され、このスレッドでonHandleIntent()メソッドが呼び出されます。より明確にするため

は `Service`は、それが呼び出されたのと同じスレッド上で動作していることをこの http://www.onsandroid.com/2011/12/difference-between-android.html

+0

ポイント番号1で、あなたはサービスでUIスレッドを操作できないと述べました... Intentserviceで可能ですか? – user2121

+0

はどちらもUIとの通信がありません。インテントサービスで必要な場合は、メインスレッドハンドラまたはブロードキャストインテントを使用する必要があります。 –

+0

あなたの答えは[this one](https://stackoverflow.com/a/15772151/1364007)にたくさんあります。どの行があなたの単語であり、どの行がコピー/ペーストされたのかを示すために、引用符のハイライト表示( '>'で始まる行)を使用できますか?そうすれば他の人があなたを盗作から非難するのを防ぐことができます。 –

関連する問題