安卓闹钟无法正常工作

12

我已经为此苦苦挣扎了数小时。我还查阅了文档和一些话题。我在两个话题中都发现了这段代码,两个人都说这段代码完美运行,但在我的电脑上不起作用。第一个Toast出现了,但第二个却没有。问题出在哪里?

public class HelloAndroid2 extends Activity {  


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

    Intent intent = new Intent(this, AlarmReceiver.class);

    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0,
    intent, PendingIntent.FLAG_ONE_SHOT);

    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
    alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (10 * 1000), pendingIntent);
    Toast.makeText(this, "Alarm set", Toast.LENGTH_LONG).show();

}

 public final class AlarmReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "Alarm worked.", Toast.LENGTH_LONG).show();

    }
 }

}


请展示你的AndroidManifest.xml文件。你应该在清单文件中声明你的广播接收器以及它所要响应的动作。 - ccheneson
3个回答

39

实际上,你不需要指定action,因为你在intent中使用了类AlarmReceiver.class

请确保在AndroidManifest.xml文件中,在<application>标签内部定义了一个接收器,如下所示:

<receiver android:name="AlarmReceiver">

编辑: 好的,有两种方式可以使用广播接收器。

1) 根据你提供的代码,AlarmReceiver.java应该包含以下内容:

public final class AlarmReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "Alarm worked.", Toast.LENGTH_LONG).show();

    }
 }

以及HelloAndroid2.java文件:

public class HelloAndroid2 extends Activity {  


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

    Intent intent = new Intent(this, AlarmReceiver.class);

    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0,
    intent, PendingIntent.FLAG_ONE_SHOT);

    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
    alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (10 * 1000), pendingIntent);
    Toast.makeText(this, "Alarm set", Toast.LENGTH_LONG).show();

}

}

通过这种方式,您可以设置广播接收器与AndroidManifest.xml和标签<receiver ...>一起工作。

2)第二种方法。使用此方法,您只需要使用1个文件HelloWorld2.java

在您的活动中,创建您的广播接收器并注册它。

public class HelloWorld2 extends Activity {
    private SharedPreferences prefs;
    private String mName;


    BroadcastReceiver alarmReceiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context, "Alarm worked", Toast.LENGTH_LONG).show();          
        }
    };


    public static final String ACTION_NAME = "com.helloworld.MYACTION";
    private IntentFilter myFilter = new IntentFilter(ACTION_NAME);


    @Override
    protected void onPause() {
        unregisterReceiver(alarmReceiver);
        super.onPause();
    }

    @Override
    protected void onResume() {
        registerReceiver(alarmReceiver, myFilter);
        super.onResume();
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        registerReceiver(alarmReceiver, myFilter);

        Intent intent = new Intent(ACTION_NAME);        

        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0,
        intent, PendingIntent.FLAG_ONE_SHOT);

        AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
        alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (10 * 1000), pendingIntent);
        Toast.makeText(this, "Alarm set", Toast.LENGTH_LONG).show();


    }

谢谢回答,但还是没有任何结果。这是.xml文件: <application android:icon="@drawable/icon" android:label="@string/app_name"> <receiver android:name="AlarmReceiver"></receiver> <activity android:name=".HelloAndroid2" 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> - erdomester
1
你应该将这个内容添加到你的帖子中,并发布类似于“编辑”的内容,以便人们知道这是额外的信息。 - ccheneson
1
这是因为,如果您在活动中嵌入了广播接收器,则需要将其注册到该活动。更多信息请参见http://developer.android.com/reference/android/content/Context.html#registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter)。 - ccheneson
感谢您的帖子,将接收器添加到清单中修复了我的代码。 - Stuntbeaver
1
啊……我无法告诉你我花了多少时间来尝试解决这个问题。清单文件!谢谢! - woot
显示剩余4条评论

11

我曾经遇到过同样的问题,直到发现我的广播接收器放在了另外一个包中,而不是默认的包中。

只需简单修改:

<receiver android:name=".AndroidAlarmService" android:enabled="true" >

对于:

<receiver android:name="com.MyCompany.MyPackage.AndroidAlarmService" android:enabled="true" >

这应该是一个来自Android的警告。我浪费了一个小时。谢谢。 - ahmadalibaloch

0
如果上面的答案对您不起作用,那么还有另一种方法可以在AlarmManager触发过期警报时接收任何回调。您只需要检查这个:通过在实例化PendingIntent时发送错误的Intent。例如,您想要在其中一个接收器上接收onReceive调用,但是您通过getActivitygetService实例化了一个PendingIntent,但实际上您想要的是getReceiver
创建PendingIntent实例时,有许多创建它的方法(getServicegetActivitygetReceivergetForegroundService):
如果您希望Activity成为意图的接收器,则:
PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_*);

如果你想要将 BroadcastReceiver 作为 intent 的接收器:
PendingIntent.getReceiver(this, 0, intent, PendingIntent.FLAG_*);

如果你想要一个前台服务,则需要意图的接收者:

PendingIntent.getForegroundService(this, 0, intent, PendingIntent.FLAG_*);

如果你想要一个Service,那么意图的接收者是:
PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_*);

此外,请确保您的意图指向正确的类(例如,为Activity、Service等创建意图)。如果您错误地传递了如下内容,则不会收到任何调用:

Intent intent = new Intent(this, MyReceiver.class); // You wanted receiver

// PendingIntent was created in such a way 
// you wanted this to be received by an activity. 
// you will not receive any call if you set it up like this.
PendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_*); 

我也在这里发布了类似的答案。

希望对你有所帮助。


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