首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android -无法从服务注册广播

Android -无法从服务注册广播
EN

Stack Overflow用户
提问于 2013-05-04 08:19:38
回答 1查看 166关注 0票数 0

我在Android开发方面没有太多经验。现在,我无法从服务的onStartCommand方法注册接收器。

在英语中应该是:我在一个活动上有两个按钮(启动/停止服务)。当我点击Start按钮时,我不想运行注册BroadcastReceiver (SMS_RECEIVED)的服务。当收到短信时,我不想看到日志跟踪。但我看不出来!

似乎我无法注册我的广播接收器,但我知道我的服务正在运行(感谢日志)。

此外,我希望使我的服务以及我的BroadcastReceiver持久化(如果我退出应用程序,我希望它在后台运行,即使我重启手机)。

有人能告诉我我的代码出了什么问题吗?也许能帮我解决第二个问题……:)

谢谢!

下面是我的代码:

-活动: Main

代码语言:javascript
复制
package com.tuto.servicerunbroadcastreceiver;

import XYZ

public class Main extends Activity implements OnClickListener
{
 Button bt_start;
 Button bt_stop;

 @Override
 protected void onCreate(Bundle savedInstanceState) 
 {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  bt_start = (Button)findViewById(R.id.button1);
  bt_start.setOnClickListener(this);
  bt_stop = (Button)findViewById(R.id.button2);
  bt_stop.setOnClickListener(this);
 }

 @Override
 public void onClick(View v) 
 {  
  switch (v.getId())
  {
   case R.id.button1 :
   {
    Log.d("Button : ", "Button start");
    startService(new Intent(this, svcMessage.class));    
    break ;
   }
   case R.id.button2 :
   {
    Log.d("Button : ", "Button stop");
    stopService(new Intent(this, svcMessage.class));
    break ;
   }
  }
 }  

 @Override
 public boolean onCreateOptionsMenu(Menu menu) 
 {
  getMenuInflater().inflate(R.menu.main, menu);
  return true;
 }
}

--服务: svcMessage

代码语言:javascript
复制
package com.tuto.servicerunbroadcastreceiver;

import XYZ;

public class svcMessage extends Service 
{
 private static final String ACTION_RECEIVE_SMS =    "android.provider.Telephony.SMS_RECEIVED";
 private BroadcastReceiver br_receiver;

 @Override
 public IBinder onBind(Intent arg0) 
 {
  return null;
 }

 @Override
 public int onStartCommand(Intent intent, int flags, int startId)
 {
  final IntentFilter filter = new IntentFilter();
  filter.addAction("ACTION_RECEIVE_SMS");
  Log.d("Service : ", "start");
  this.br_receiver = new BroadcastReceiver() 
  {
   @Override
   public void onReceive(Context context, Intent intent) 
   {
    Log.d("LOG : ", "onReceive");
   }
  };
  this.registerReceiver(this.br_receiver, filter);  
  return (START_STICKY);
 }

 @Override
 public void onDestroy()
 {
  super.onDestroy();
  Log.d("Service : ", "destroy");
  this.unregisterReceiver(this.br_receiver);
 }  
}

- Manifest.xml

代码语言:javascript
复制
<manifest 
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.tuto.servicerunbroadcastreceiver"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.tuto.servicerunbroadcastreceiver.Main"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service android:name="com.tuto.servicerunbroadcastreceiver.svcMessage">
        </service>
    </application>
</manifest>
EN

回答 1

Stack Overflow用户

发布于 2013-05-04 08:33:31

看起来你这里有一个简单的bug:

代码语言:javascript
复制
//without ""
filter.addAction(ACTION_RECEIVE_SMS);

别忘了添加权限:

代码语言:javascript
复制
<uses-permission android:name="android.permission.RECEIVE_SMS" />

还有一件事,如果您在onDestory()中取消注册接收器。您应该在onCreate() on Service中注册。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16369333

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档