Android – 通过put / getExtra启动额外信息的服务

我真的试图通过intent.putExtra()和getIntent()。getExtras()并将其应用于SimpleService教程之一。 我知道很多人已经问过“为什么bundle extras总是空的?” 我保证我试图破解我在这里发现了几个小时的答案之前,我认为张贴,但我不认为我已经足够先进到足以真正了解是什么,我必须做错了人们张贴的小片段。 正因为如此,我把我的活动和服务的完整代码。

我认为我的问题是,我的服务背景中并不存在我的初始意图(我在我的活动中创build的意图)。 我想知道我是否完全用错了方向/目的来使用Intents? 我在我的服务中尝试了一个intent.putExtra,尝试向另一个方向发送一个string,但是这些额外的东西总是为空。 所以冒着重复的风险,为什么bundle extras总是空的? 我如何在我的活动和服务中创造一个单一的意图?

我应该注意到,下面显示的代码显然会有一个空的额外的,因为我已经注意到了一些我尝试.getExtras()失败。 为了清洁,我删除了其余部分。

编辑:答案感谢答复,在代码为了那些谁也一直谷歌search几个小时。 把这个放在你的服务(请注意,返回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(); } } 

Solutions Collecting From Web of "Android – 通过put / getExtra启动额外信息的服务"

你需要看onStartCommand()函数(我不在桌面上,所以我不能方便地链接到javadoc)。 这将收到你通过的意图,你的额外应该在那里。

我想你需要在你的服务中这样做。

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

得到你传递的意图…但我不是100%,所以仔细检查http://developer.android.com/reference/android/app/Service.html