Android - 通过 put/getExtra 启动具有额外信息的服务

Posted

技术标签:

【中文标题】Android - 通过 put/getExtra 启动具有额外信息的服务【英文标题】:Android - Starting a service with extra information through put/getExtra 【发布时间】:2011-12-28 02:27:04 【问题描述】:

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

我认为我的问题是我的起始意图(我在我的活动中创建的那个)在我的服务上下文中不存在。我想知道我是否完全在错误的方向/目的上使用了 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();



【问题讨论】:

欢迎来到 ***!如果您发现回复有帮助,请投票。如果回复成功回答了您的问题,请点击旁边的绿色复选标记接受答案。也请查看***.com/questions/how-to-ask 以获取有关如何写出好问题的建议 Kurtis,我喜欢你的股票邀请函!我很高兴有人花时间告知新来者如何使用该服务:) @Adam:我不明白,对不起:你的服务代码最后没有onStartCommand()?? 【参考方案1】:

您需要查看onStartCommand() 函数(我不在桌面,因此无法方便地链接到javadoc)。这将收到您传递的意图,并且您的额外内容应该在那里可用。

【讨论】:

很好 - 现在想知道如何发回消息。 感谢 URL 连接 @H9kDroid。至于响应,您有两个选择:使用 BroadcastReceiver 或使用 onBind。 我意识到我可以做的一个可能很糟糕的 hack - 因为我的服务与我的应用程序在同一个进程中运行(我认为?),我实际上可以访问/更改任何我想要的公共变量喜欢......将服务作为真正的服务运行是个坏主意 - 但它适用于我的简单教程目的。【参考方案2】:

我认为你需要在你的服务中这样做..

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

要了解您传递的意图...但我不是 100% 对此,所以请仔细检查 http://developer.android.com/reference/android/app/Service.html

【讨论】:

它有效,谢谢。顺便说一句,似乎我实际上必须等待 onCommand() 在 onCreate() 之后发生。然后我就能收到额外的东西了。 来自文档:这是将在 pre-2.0 平台上调用的旧 onStart 方法。在 2.0 或更高版本上,我们会覆盖 onStartCommand(),因此不会调用此方法。

以上是关于Android - 通过 put/getExtra 启动具有额外信息的服务的主要内容,如果未能解决你的问题,请参考以下文章

Android环境搭建与通过命令行方式创建Android应用

Android开发之通过反射获取到Android隐藏的方法

markdown [android debug]通过Android SDK调试Android终端。 #test #debug #android

android 通过命令行启动Apk

Android - 切换按钮仅通过滑动改变状态

Android:通过 Playstore 安装时,Spotify 身份验证在 Android 6.0 上不起作用