启动应用程序但不启动活动时,我的广播接收器无法工作。

5

在我的应用程序中,我有一个广播接收器来捕获发送到我的手机的消息。

<receiver
            android:name="com.qmobile.ows.SMS_Receiver"
            android:enabled="true" 
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.PHONE_STATE" />
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />                  
            </intent-filter>
</receiver>

如果我使用activity GUI启动应用程序,则广播接收器可以正常工作。
我想在没有activity的情况下启动我的应用程序,并且不显示应用程序图标,因此我从我的activity中删除了以下代码。
 <intent-filter>
                  <action android:name="android.intent.action.MAIN" />
              <category android:name="android.intent.category.LAUNCHER" />
 </intent-filter>

然后,广播接收器不起作用了。 请帮我解决这个问题。

请放置您的 onRecive() 代码。 - Ankit
1
简单的后台应用在Android 3.0版本之后停止工作。CommonsBlog - Lucifer
5个回答

4

对于Android 3.1及以上版本

在任何已注册的清单广播接收器生效之前,您必须启动其中一个活动。

请参阅开发者文档,特别是关于停止应用程序的启动控制的部分,适用于Android 3.1。


4
这是因为Android操作系统不允许非活动状态的应用程序接收某些重要广播(例如android.provider.Telephony.SMS_RECEIVED),以防止恶意应用程序。如果您有一个活动正在运行,那么您的进程就是活着的,因此您的接收器可以接收广播。我建议您创建一个透明的活动,并使用startService在后台启动一个服务,然后完成该活动。由于您的服务正在运行,因此您的进程仍然是活着的,这样Android操作系统就会允许您接收广播。

6
这不是真的!即使应用程序没有“活着”,广播也可以接收到。这个问题的原因是,从Android 3.1及更高版本开始,所有广播都需要用户至少运行一次您的应用程序才能工作。这是为了防止恶意软件。 - Eran Katsav
在Android 3.1 API预览中,“应用程序在安装后但尚未启动以及用户手动停止时处于停止状态”,而停止的应用程序无法接收广播。 - Eran Katsav

2
如果您正在测试没有活动的广播接收器,则应编辑运行配置。在编辑配置对话框中,选择“不启动活动”选项,以便安装但不启动活动,并单击“运行”按钮。这将启动不带活动的应用程序。
以下内容可能会对您有所帮助:
创建和发送广播意图
已经为SendBroadcast应用程序创建了框架,现在是实现代码以发送广播意图的时候了。这涉及到实现之前指定为Button视图中onClick目标的broadcastIntent()方法。找到并双击SendBroadcastActivity.java文件,并修改它以添加创建和发送广播意图的代码。一旦修改完成,此类的源代码应如下所示:
package com.ebookfrenzy.sendbroadcast;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.content.Intent;
import android.view.View;

public class SendBroadcastActivity extends ActionBarActivity {

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

    public void broadcastIntent(View view)
    {
       Intent intent = new Intent();
       intent.setAction("com.ebookfrenzy.sendbroadcast");
       intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
       sendBroadcast(intent);
    }
.
.
.
}

创建广播接收器

要创建广播接收器,需要创建一个新类,该类是BroadcastReceiver超类的子类。创建一个名为BroadcastReceiver的新项目,将应用程序名称设置为com.ebookfrenzy,然后在单击完成之前选择添加无活动选项。

在Project工具窗口中,导航到app->java,右键单击包名称。从结果菜单中,选择New->Other->Broadcast Receiver菜单选项,将类命名为MyReceiver,并确保选择了导出和启用选项。

创建后,Android Studio会自动将新的MyReceiver.java类文件加载到编辑器中,其应如下所示:

package com.ebookfrenzy.broadcastreceiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class MyReceiver extends BroadcastReceiver {

    public MyReceiver() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.
        throw new UnsupportedOperationException("Not yet implemented");
    }
}

从代码中可以看出,Android Studio为新类生成了一个模板,并为onReceive()方法生成了一个存根。现在需要对该类进行一些更改以实现所需的行为。因此,在MyReceiver.java文件中保持不变,修改代码如下:

package com.ebookfrenzy.broadcastreceiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class MyReceiver extends BroadcastReceiver {

    public MyReceiver() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {

        Toast.makeText(context, "Broadcast Intent Detected.",
                Toast.LENGTH_LONG).show();
    }   

}

广播接收器代码现在已经完成。

在清单文件中配置广播接收器 与其他Android项目一样,BroadcastReceiver也有一个名为AndroidManifest.xml的清单文件。

该文件需要宣传广播接收器的存在,并包含一个意图过滤器来指定接收器感兴趣的广播意图。在上一节创建BroadcastReceiver类时,Android Studio会自动向清单文件添加一个<receiver>元素。因此,唯一剩下的任务是在适当配置自定义操作字符串的<receiver>声明内部添加一个<intent-filter>元素:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.ebookfrenzy.broadcastreceiver.broadcastreceiver" >

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <receiver
            android:name=".MyReceiver"
            android:enabled="true"
            android:exported="true" >
         <intent-filter>
                <action 
          android:name="com.ebookfrenzy.sendbroadcast" >
                </action>
            </intent-filter>
        </receiver>
    </application>

</manifest>

完成清单文件后,广播示例已准备好进行测试。


1
好的。这是对我有效的方法。我创建了一个启动器活动。删除了对setContentView(R.layout.activity_main)的调用。
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //setContentView(R.layout.activity_main);
    finish();
}

0
在你的意图过滤器中添加默认类别
 <category android:name="android.intent.category.DEFAULT" />

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接