Android 如何创建无活动的广播接收器

Android 如何创建无活动的广播接收器,android,sms,broadcastreceiver,Android,Sms,Broadcastreceiver,我想创建一个应用程序,将响应接收短信,并显示一个对话框。如何在清单中注册接收方而不在活动中定义 我试图将清单中的receiver/intent filter标记保留在activity标记之外,但emulator不会安装apk,因为没有启动活动。将BroadcastReceiver保留为主活动会导致Logcat中出现“无法实例化活动”错误 有什么帮助吗 谢谢, 晴朗的 接收器类别 public class SMSReceiver extends BroadcastReceiver { // o

我想创建一个应用程序,将响应接收短信,并显示一个对话框。如何在清单中注册接收方而不在活动中定义

我试图将清单中的receiver/intent filter标记保留在activity标记之外,但emulator不会安装apk,因为没有启动活动。将BroadcastReceiver保留为主活动会导致Logcat中出现“无法实例化活动”错误

有什么帮助吗

谢谢, 晴朗的

接收器类别

public class SMSReceiver extends BroadcastReceiver {

 // onCreat is invoked when an sms message is received.
 // Message is attached to Intent via Bundle, stored in an Object
 // array in the PDU format.
 public void onReceive(Context context, Intent intent) {
  // get the SMS message passed in from Bundle
  Bundle bundle = intent.getExtras();        
    String bodyText = "";            
    String from = "";
    if (bundle != null) {
        //Retrieve sms message within Object array
        Object[] pdus = (Object[]) bundle.get("pdus");
        SmsMessage[] msgs = new SmsMessage[pdus.length];            

        for (int i=0; i < msgs.length; i++)
         msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);

        for (SmsMessage message: msgs) {
         bodyText = message.getMessageBody();
         from = "Message from " + message.getOriginatingAddress() + ": ";
        }
        // Display message in pop up
        Toast.makeText(context, from + bodyText, Toast.LENGTH_SHORT).show();
    }                  
 }
}
公共类SMSReceiver扩展了BroadcastReceiver{
//当收到sms消息时调用onCreat。
//消息通过存储在对象中的Bundle附加到Intent
//PDU格式的数组。
公共void onReceive(上下文、意图){
//获取从Bundle传入的SMS消息
Bundle=intent.getExtras();
字符串bodyText=“”;
字符串from=“”;
if(bundle!=null){
//在对象数组中检索sms消息
Object[]pdus=(Object[])bundle.get(“pdus”);
SmsMessage[]msgs=新SmsMessage[pdus.length];
对于(int i=0;i
清单

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

  <receiver android:name=".SMSReceiver">
   <intent-filter>
    <action android:name="android.provider.Telephony.SMS_RECEIVED" />
   </intent-filter>
  </receiver>
 </application>

    <uses-sdk android:minSdkVersion="7" />
    <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>

</manifest> 

您试图做的是错误的,至少有以下原因

  • MAIN/LAUNCHER仅适用于活动,由于您的代码中没有扩展活动的类,这就是导致错误的原因
  • 虽然只实现广播接收器或服务的“应用”没有什么问题,但是让用户知道事情已经正确初始化是一个好做法。即使你可以在“所有应用程序”中列出一个接收者/服务,如果他们选择了它却什么也没看到,他们也不会高兴——用户喜欢看到一些反馈

  • 简言之,创建一个简单的活动,它将出现在“所有应用程序”中,并具有主/启动器意图设置,当它启动时,只需创建一个对话框,对用户说“嗨,欢迎光临…”或其他一些反馈,让他们知道事情已经正确启动。对话框上有一个“确定”按钮,按下该按钮时,调用活动的finish()方法,使接收器保持在原位。

    隐藏
    活动的一种方法是在应用程序的Android清单文件中使用以下主题:

    <activity
        android:name=".SomeActivity"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.Translucent.NoTitleBar" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    
    
    
    注意:使用此选项确实会使你的应用程序在启动时不显示,但它仍然不会删除启动器图标。如果你删除了图标,你将无法启动应用程序。(想办法绕过这个问题!)

    来自:

    没有结果从接收器传播,接收器不能中止广播。如果要允许接收器传播结果或中止广播,则必须使用sendOrderedBroadcast(意图,字符串)发送有序广播


    改用

    我实施了一项“反馈”活动,提醒用户程序正在运行。我的另一个问题是,以对话框为主题的活动会出于某种原因弹出反馈窗口,但调用finish()方法是有效的。谢谢你的帮助。我很高兴这对你有用-祝你其余的代码好运。我尝试过做类似的事情,实际上更简单,因为我只想在旋转屏幕时在状态栏中得到一个通知。在模拟器上没有这样的运气。查看我的答案查看我的答案我只是在搜索同一个问题时发现了这个,并认为我已经把它放在这里了。希望它能帮助别人!