将AlarmManager设置为在Android应用未运行时运行?

时间:2014-11-22 06:30:47

标签: java android alarmmanager android-pendingintent

我看过几个指南,我基本上已经这样做了:

Main.java

public class Main extends Activity 
{
    PendingIntent pendingIntent;

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

      Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("America/New_York"));

      cal.set(Calendar.HOUR_OF_DAY, 22);
      cal.set(Calendar.MINUTE, 0);
      cal.set(Calendar.SECOND, 0);

      Intent myIntent = new Intent(Main.this, Receiver.class);
      pendingIntent = PendingIntent.getBroadcast(Main.this, 0, myIntent,0);

      AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
      alarmManager.set(AlarmManager.RTC, cal.getTimeInMillis(), pendingIntent);
    }
}

Receiver.java

public class Receiver extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
       Toast.makeText(context, "I'm running", Toast.LENGTH_SHORT).show();
    }   
}

AndroidManifest.xml还包含<receiver android:name=".Receiver"/>

因此,根据我所读过的内容,无论应用程序是否实际运行,上述代码都应在纽约时间晚上10点显示toast。目前,即使应用程序正在运行,它也不会执行任何操作。看起来Receiver类甚至没有被调用。我错过了什么?

3 个答案:

答案 0 :(得分:0)

你是否注册了Receiver with intent-filter? 如下所示

        <intent-filter android:priority="2147483647" >
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
        </intent-filter>

答案 1 :(得分:0)

调整Calendar对象的时间组件时,仅修改您专门设置的时间组件。如果您希望闹钟在晚上10点开始,您还需要设置Calendar.MINUTE值。例如,如果您在下午6:47运行您的应用程序,那么您的警报就会被设置为晚上10:47。

答案 2 :(得分:0)

我发现了问题(正如我所暗示的那样here):我的Main.javaReceiver.java文件未放在同一个包中。我不明白这背后的逻辑。我喜欢将我的java文件分成不同的软件包以用于组织目的,但显然Android并不喜欢这样。

如果有人可以告诉我如何使用java下的2个不同包/文件夹中的src文件执行上述操作,我会将其作为正确答案。