启动/屏幕开启广播接收器无法工作

5

我有一个空白的 HelloWorld 应用程序:

package tutorials.TestReceivers;

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

public class TestReceiversActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

使用这个BootReceiver.Java:
package tutorials.TestReceivers;

import android.content.BroadcastReceiver;

public class BootReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent arg1) {
    Intent intent = new Intent(context, TestReceiversActivity.class);
        context.startActivity(intent);    
    }
}

并且这个清单:
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".TestReceiversActivity"
                  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-permission="android.permission.RECEIVE_BOOT_COMPLETED"
            android:name="development.TestReceiversActivity.BootReceiver" >
            <intent-filter >
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.SCREEN_ON" />
            </intent-filter>
        </receiver>
    </application>
</manifest>

在运行应用程序并关闭它之后,当我解锁屏幕(SCREEN_ON)时,什么都没有发生。而且当我启动设备时,会出现以下信息:“应用程序TestReceiversActivity(教程.TestReceivers进程)意外停止。请重试。”

1
清单文件中的SCREEN_ON无法正常工作。 - Selvin
2个回答

7

经过长时间的挣扎,我解决了以上问题。

正确注册引导广播接收器(并根据其打开活动)的方法是:

空白的 HelloWorld 应用程序(TestReceiversActivity.java):

package tutorials.TestReceivers;

import android.app.Activity;
public class TestReceiversActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

另一个引导接收器类(BootReceiver.java)
package tutorials.TestReceivers;

import android.content.BroadcastReceiver;
public class BootReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
         Log.d("DAVID", "Hi, Boot reciver was catch!");
         Intent i = new Intent(context, TestReceiversActivity.class);
         i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         context.startActivity(i);
       }
}

注意:您必须设置标志才能使其工作!
将清单设置为:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="tutorials.TestReceivers"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="8" />

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <application android:icon="@drawable/icon" android:label="@string/app_name">
            <receiver android:name=".BootReceiver" >
            <intent-filter >
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>
        <activity android:name=".TestReceiversActivity"
                  android:label="@string/app_name">
                <intent-filter >
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
        </activity>
    </application>
 </manifest>

祝您愉快!


4

删除android-permission="android.permission.RECEIVE_BOOT_COMPLETED"。将一个<uses-permission>元素作为<manifest>元素的子元素添加该权限。

如果问题仍然存在,请使用adb logcat、DDMS或Eclipse中的DDMS透视图查看LogCat并检查与崩溃相关的堆栈跟踪。

这里是一个示例项目,展示了如何在启动时获得控制权。

SCREEN_ON不能从清单中工作。


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