12

我真的试图通过 intent.putExtra() 和 getIntent().getExtras() 并将它们应用到 SimpleService 教程之一。我知道很多人已经问过“为什么捆绑附加服务总是无效的?” 我保证在考虑发布之前我已经尝试破解我在这里找到的答案几个小时,但我认为我不够先进,无法真正理解人们发布的小片段我一定做错了什么。因此,我输入了我的活动和服务的完整代码。

我认为我的问题是我的起始意图(我在我的活动中创建的那个)在我的服务上下文中不存在。我想知道我是否完全在错误的方向/目的上使用了 Intents?我确实在我的服务中尝试了一个 intent.putExtra,尝试向另一个方向发送一个字符串,但这些额外内容也始终为空。那么冒着重复的风险,为什么捆绑附加服务总是无效的?如何创建一个既存在于我的活动上下文中又存在于我的服务中的意图?

我应该注意,下面显示的代码显然会有一个 null extras,因为我已经注释掉了一些失败的 .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 回答