12

私は実際にインテント.putExtra() と getIntent().getExtras() を取得して、SimpleService チュートリアルの 1 つに適用しようとしました。多くの人がすでに「なぜバンドル エクストラは常に null なのですか?」と尋ねていることを知っています。投稿を検討する数時間前に、ここで見つけた回答をハックしようとしたことを約束しますが、人々が投稿しているマイナーなスニペットで何が間違っているのかを本当に理解できるほど進んでいないと思います。そのため、アクティビティとサービスの完全なコードを入れました。

私の問題は、開始インテント (アクティビティで作成したインテント) がサービスのコンテキストに存在しないことだと思います。多分私は間違った方向/目的でインテントを完全に使用しているのだろうか? 私は自分のサービスでintent.putExtraを試して、文字列を反対方向に送信しようとしましたが、それらのエクストラも常にnullです。繰り返しのリスクがあるので、なぜ bundle extras は常に null なのですか? アクティビティとサービスの両方のコンテキストに存在する単一のインテントを作成するにはどうすればよいですか?

失敗した .getExtras() への試みのいくつかをコメントアウトしたため、以下に表示されているコードには明らかにヌルのエクストラがあることに注意してください。きれいにするために残りを削除しました。

編集:返信のおかげで、何時間もグーグルをしている人々のためにコードで答えます。これをサービスに入れます (戻り値 START_REDELIVER_INTENT が間違っている可能性があることに注意してください):

@Override
public int onStartCommand( Intent intent , int flags , int startId )
{
      super.onStartCommand(intent, flags , startId);

      extras = intent.getExtras();

          //just checking
      if( extras != null )
      Toast.makeText(this,extras.getString("extratoservice"), Toast.LENGTH_SHORT).show();

      return START_REDELIVER_INTENT;

}

私の活動 (Sai Geetha のブログに基づく):

package com.example.BroadcastIntent;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class BroadcastIntentActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Button start = (Button)findViewById(R.id.buttonStart);
    start.setOnClickListener(startListener);

    Button stop = (Button)findViewById(R.id.buttonStop);
    stop.setOnClickListener(stopListener);   

    //the intent I'm using to start and stop the service -- the extras don't go anywhere....
    intent = new Intent(BroadcastIntentActivity.this,BroadcastService.class);     
    intent.putExtra("extratoservice", "if you can read this, it made it to the service" );

}

Boolean serviceRunning;
Intent intent;

//Clicks from Geetha's Blog
private OnClickListener startListener = new OnClickListener() {
     public void onClick(View v){

         startService(intent);
         serviceRunning = true;
     }                 
};

private OnClickListener stopListener = new OnClickListener() {
    public void onClick(View v){

         try
         {
             stopService(intent);
             serviceRunning = false;                
         }
         catch( Exception e)
         {
             Toast.makeText(getApplicationContext(), "Service was not running...",Toast.LENGTH_SHORT).show(); 
         }
     }                 
 };

}

そして、これは私のサービスです:

package com.example.BroadcastIntent;

import android.app.Service;
import android.content.Intent;
import android.os.Bundle;
import android.os.IBinder;
import android.widget.Toast;

public class BroadcastService extends Service{

@Override
public IBinder onBind(Intent arg0) {
    // TODO Auto-generated method stub

    //extras = arg0.getExtras();    <-- this has null extras, too...

    return null;
}

Bundle extras;

@Override
public void onCreate() {
      super.onCreate();

      // extras = getIntent().getExtras();   <-- this is undefined?

      if( extras == null )
      Toast.makeText(this,"Service created... extras still null", Toast.LENGTH_SHORT).show();
      else
      Toast.makeText(this,extras.getString("extratoservice"), Toast.LENGTH_SHORT).show();

}

@Override
public void onDestroy() {
      super.onDestroy();
      Toast.makeText(this, "Service destroyed ...", Toast.LENGTH_SHORT).show();

}
}
4

2 に答える 2

16

onStartCommand()関数を確認する必要があります(私はデスクトップにいないので、javadoc に簡単にリンクできません)。これにより、渡されたインテントが受信され、そこでエクストラが利用できるようになります。

于 2011-11-13T16:00:25.623 に答える
2

サービスでこれを行う必要があると思います..

    @Override
   public void onStart(Intent intent, int startId) {
      super.onStart(intent, startId);

あなたが渡している意図を得るために...しかし、私はこれについて100%ではないので、http://developer.android.com/reference/android/app/Service.htmlを再確認して ください

于 2011-11-13T16:04:48.937 に答える