启动应用程序没有活动,我的广播接收器无法工作

时间:2014-03-11 06:35:15

标签: android broadcastreceiver

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

<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>

如果我使用活动GUI启动应用程序,则BroadCast Receiver正常工作。

我想在没有活动的情况下启动我的应用程序并且不显示图标应用程序,因此我从我的活动删除以下代码

 <intent-filter>
                  <action android:name="android.intent.action.MAIN" />
              <category android:name="android.intent.category.LAUNCHER" />
 </intent-filter>

之后,广播接收器无法正常工作。

请帮我解决这个问题。

5 个答案:

答案 0 :(得分:3)

适用于Android 3.1及更高版本

您必须在任何清单注册的BroadcastReceiver工作之前启动您的一项活动。

请参阅开发人员文档,特别是 -

部分

Launch controls on stopped applications for android-3.1

答案 1 :(得分:3)

这是因为如果应用程序的进程不活动,Android操作系统不允许BroadcastReceiver接收某些重要的广播(android.provider.Telephony.SMS_RECEIVED必须是其中之一)。它旨在对抗邪恶的应用程序。如果您正在运行某个活动,则您的进程处于活动状态,因此您的接收方可以接收广播。

我认为您可以制作透明 activity并使用startService在后台启动service,然后完成activity。当您的服务正在运行时,你的过程还活着,所以Android OS会让你接收广播。

答案 2 :(得分:2)

如果您正在测试没有Activity的广播接收器,那么您应该编辑您的运行配置。 出现“编辑配置”对话框时,选择“不启动活动”选项以便安装活动但未启动,然后单击“运行”按钮 这将在没有活动的情况下启动应用程序。

这可以帮到你:

制作和发送广播意图

为SendBroadcast应用程序创建了框架之后,现在是时候实现代码来发送广播意图了。这涉及实现先前指定的broadcastIntent()方法作为用户界面中Button视图的onClick目标。找到并双击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,这次选择Add No Activity选项,然后单击Finish。

在项目工具窗口中,导航到app - &gt; java并右键单击包名称。从结果菜单中选择New - &gt;其他 - &gt; “广播接收器”菜单选项,将类命名为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>元素。因此,剩下的就是在为自定义操作字符串正确配置的<intent-filter>声明中添加<receiver>元素:

<?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>

清单文件完成后,广播示例即可进行测试。

答案 3 :(得分:0)

在您的意图过滤器中添加DEFAULT类别

 <category android:name="android.intent.category.DEFAULT" />

答案 4 :(得分:0)

确定。这对我有用。我创建了一个启动器活动。删除了对setContentView(R.layout.activity_main)的调用

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