2012-11-04 50 views
1

在这里,我想读它,我所看到的各种实例的消息和烤面包片,其中有一个扩展BroadcastReceiver单独的一类,但他们都没有提到如何启动这个类(我们使用startactivity()或财产以后其他)。我发布了通过O'Reilly烹饪书链接的代码。我试图从ddms短信,但它不显示消息的祝酒词。任何帮助表示赞赏,因为这是我第一次使用BroadcastReceiver。开始广播接收器

invitationSMSreciever.java

package com.SMS; 
import android.app.Activity; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.sax.StartElementListener; 
import android.telephony.SmsMessage; 
import android.util.Log; 
import android.widget.Toast; 

public class invitationSMSreciever extends BroadcastReceiver { 

    final String TAG = "BombDefusalApp"; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Bundle bundle = intent.getExtras(); 
     SmsMessage[] msgs = null; 
     String message = ""; 
     if (bundle != null) { 
      Object[] pdus = (Object[]) bundle.get("pdus"); 
      msgs = new SmsMessage[pdus.length]; 
      for (int i = 0; i < msgs.length; i++) { 
       msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); 
       message = msgs[i].getMessageBody(); 
       Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); 
       if (msgs[i].getMessageBody().equalsIgnoreCase("Invite")) { 
        // Intent myIntent = new Intent(MainMenu.this, 
        // com.bombdefusal.ReceivedSMSActivity.class); 
        Intent myIntent = new Intent(); 
        myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
        myIntent.setAction("com.example.helloandroid.INVITE"); 
        context.startActivity(myIntent); 
       } 
      } 
     } 
    } 
} 

的MainMenu

package com.SMS; 

import com.SMS.R; 

import android.app.Activity; 
import android.os.Bundle; 

public class MainMenu extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
    } 
} 

ReceivedSMSActivity

package com.SMS; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.KeyEvent; 

import com.SMS.R; 

public class ReceivedSMSActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     startService(new Intent ("com.android.PLAY")); 
     setContentView(R.layout.invite); 
    } 
    public boolean onKeyDown(int keyCode, KeyEvent service) { 
     stopService(new Intent("com.bombdefusal.START_AUDIO_SERVICE")); 
     finish(); 
     return true; 
    } 
} 

清单

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.SMS" android:versionCode="1" android:versionName="1.0"> 
    <uses-permission android:name="android.permission.RECEIVE_SMS"/> 
    <application android:icon="@drawable/icon" android:label="@string/app_name"> 
     <activity android:name=".MainMenu" android:label="@string/app_name"> 
      <intent-filter> 
       <action android:name="com.SMS" /> 
       <category android:name="android.intent.category.DEFAULT" /> 
      </intent-filter> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

     <activity android:name="com.SMS.ReceivedSMSActivity" 
        android:label="@string/app_name"> 
      <intent-filter> 
       <action android:name="com.example.helloandroid.INVITE"/> 
       <category android:name="android.intent.category.DEFAULT"/> 
      </intent-filter> 
     </activity> 

     <receiver android:name="com.SMS.invitationSMSreciever" 
        android:enabled="true"> 
      <intent-filter> 
       <action android:name="android.provider.Telephony.SMS_RECEIVED"/> 
       <category android:name="android.intent.category.DEFAULT"/> 
      </intent-filter>   
     </receiver> 
    </application> 
</manifest> 

回答

1

你有两个选择这样做:

  1. 注册您在AndroidManifest文件静态广播接收机。因此,它会被自动调用。
  2. 注册你在代码中使用registerReceiver()方法动态广播接收机。在这种情况下,应将此方法与登记您的接收器的unregisterReceiver()配对。

通常,如果广播接收器是作为单独的类实现的,那么它通常会在AndroidManifest文件中静态注册。我猜你情况下,你应该只以下行添加到文件:

<receiver android:name=".invitationSMSreciever" android:exported="true" > 
    <intent-filter android:priority="1000"> 
    <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
    </intent-filter> 
</receiver> 
+0

thax快速回复忘了不好意思张贴明显 – dreamer1989

+0

@Yuri IVE的附加清单文件,你可以看到一个接收器注册清单它仍然不能正常使用PLZ你能解释或回答如何initaite的广播接收器类 – dreamer1989

+0

Android系统的代码调用你的广播接收器,当它获得对应于意图过滤器,您在定义的意图的方法的onReceive AndroidManifest.xml中。你是否收到模拟器的默认信使应用程序从ddms发送的短信?如果没有,那么问题不在你的代码中。 – Yury