2014-01-05 142 views
0

我正在接收消息,我需要启动服务的应用程序。但是我的意图服务没有运行。下面是我在做什么:意图服务不从广播接收器调用时开始

广播接收器:

public void onReceive(Context context, Intent intent) 
{ 
    this.con=context; 
    Toast.makeText(context,"Broadcast received", Toast.LENGTH_LONG).show(); 

    Bundle bundle = intent.getExtras(); 
    Object[] messages = (Object[])bundle.get("pdus"); 
    SmsMessage[] sms = new SmsMessage[messages.length]; 

    for(int i=0;i<messages.length;i++) 
    { 
     sms[i] = SmsMessage.createFromPdu((byte[]) messages[i]); 
    } 

    String smsFrom = sms[0].getDisplayOriginatingAddress().toString(); 

    Intent in= new Intent(context, ResponseService.class); 
    in.putExtra("sender",smsFrom); 
    context.startService(in); 
} 

IntentService:

public class ResponseService extends IntentService 
{ 
    public ResponseService(String name) 
     { 
     super(name); 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) 
     { 
     // TODO Auto-generated method stub 
     Log.d("Notify", "In Response Service"); 
     getCurrentLocation(); 
     } 
} 

我不明白在日志文件中任何东西。任何人都可以帮助我理解这个问题吗?提前致谢。

更新 我已经宣布的manifest.xml两个广播接收器和服务如下:

<receiver android:name=".BroadCastReceiver" > 
     <intent-filter android:priority="10000" > 
      <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
     </intent-filter> 
    </receiver> 

    <service android:name=".ResponseService" /> 

而且我再次尝试运行应用程序,并经过一段时间的应用程序强制关闭给一个java .lang.instantiationexception 有人可以帮我解决这个问题吗?

回答

1

我的第一个问题是:您的广播接收机是否工作?广播接收器中的烤面包是否显示? 第二个问题:您是否声明了您的意向服务清单?你可以这样做:

<service android:name="yourPackage.ResponseService" > 
+0

yes吐司正在显示,我已经在清单中声明了收件人。接收器工作得很好。 – Guria

+0

然后你的意图服务不起作用。一定要声明'ResponseService',就像我在我的答案中声明的一样。 – longwalker

+0

我也宣布过 – Guria

1

异常,java.lang.InstantiationException真的解决了我的问题。我错过了一个零参数的公共构造函数。我只是改变

public ResponseService(String name) 
     { 
     super(name); 
     // TODO Auto-generated constructor stub 
    } 

分为:

public ResponseService() 
     { 
     super("ResponseService"); 
     // TODO Auto-generated constructor stub 
    } 

而现在它的工作真的很好。希望它也可以帮助其他人。

0

您应该使用WakefulBroadcastReceiver:

一个WakefulBroadcastReceiver是一种特殊类型的广播接收机的该负责创建和管理你的应用程序的部分唤醒锁。它将处理SMS的工作传递给ResponseService(IntentService),同时确保设备不会在转换中重新进入休眠状态,因此您的Intent Service将正确运行。

public class YourReceiver extends WakefulBroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     // Explicitly specify that ResponseService will handle the intent. 
     ComponentName comp = new ComponentName(context.getPackageName(), 
       ResponseService.class.getName()); 

     this.con=context; 
     Toast.makeText(context,"Broadcast received", Toast.LENGTH_LONG).show(); 

     Bundle bundle = intent.getExtras(); 
     Object[] messages = (Object[])bundle.get("pdus"); 
     SmsMessage[] sms = new SmsMessage[messages.length]; 

     for(int i=0;i<messages.length;i++) 
     { 
      sms[i] = SmsMessage.createFromPdu((byte[]) messages[i]); 
     } 

     String smsFrom = sms[0].getDisplayOriginatingAddress().toString(); 

     Intent in= new Intent(context, ResponseService.class); 
     in.putExtra("sender",smsFrom) 
     // Start the service, keeping the device awake while it is launching. 
     startWakefulService(context, (intent.setComponent(comp))); 
     setResultCode(Activity.RESULT_OK); 
    } 
} 

而且你IntentService会像:

@Override 
    protected void onHandleIntent(Intent intent) { 
     Bundle extras = intent.getExtras(); 


     if (!extras.isEmpty()) { 

      //Do something 

     } 
     // Release the wake lock provided by the WakefulBroadcastReceiver. 
     YourReceiver.completeWakefulIntent(intent); 
    } 
0

我以前做过的报警,但你可以很容易忘记沿着你的manifest.xml您wakefulbroadcastreceiver声明。