如何在Android中使用AlarmManager启动Activity?

时间:2011-08-13 10:55:45

标签: android alarmmanager

我已经通过十几个关于这个问题的教程和论坛答案,但仍然无法将一些工作代码放在一起。我会尽力保持这个问题:

如何使用AlarmManager(在Android API中)在给定时间启动活动?这个问题的任何解决方案都可以。

我最近的尝试是在下面。

(导入省略。我希望MyActivity在程序打开后3秒开始,但它没有。没有错误消息可以说。)

public class AndroidTest2Activity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Context context = this;//.getApplicationContext();

        AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); // CORRECT
        Intent intent = new Intent(context, myReceiver.class); // CORRECT
        PendingIntent pending = PendingIntent.getBroadcast( context, 0, intent, 0 ); // CORRECT
        manager.set( AlarmManager.RTC, System.currentTimeMillis() + 3000, pending ); // CORRECT

        setContentView(R.layout.main);
    }
}

public class myReceiver extends BroadcastReceiver {
    public void onReceive(Context context, Intent intent) {
        Intent i=new Intent(context, myActivity.class);
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(i);
    }
}

public class myActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("", "Elusive success");
        setContentView(R.layout.main);
    }
}

任何建议都将受到赞赏。

请注意:我已经在清单中找到了myReceiver

8 个答案:

答案 0 :(得分:6)

如果其他人偶然发现了这一点 - 这里有一些工作代码(在2.3.3模拟器上测试过):

public final void setAlarm(int seconds) {
    // create the pending intent
    Intent intent = new Intent(MainActivity.this, AlarmReceiver.class);
    // intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0,
            intent, 0);
    // get the alarm manager, and scedule an alarm that calls the receiver
    ((AlarmManager) getSystemService(ALARM_SERVICE)).set(
            AlarmManager.RTC, System.currentTimeMillis() + seconds
                    * 1000, pendingIntent);
    Toast.makeText(MainActivity.this, "Timer set to " + seconds + " seconds.",
            Toast.LENGTH_SHORT).show();
}

public static class AlarmReceiver extends BroadcastReceiver {
    public void onReceive(Context context, Intent intent) {
        Log.d("-", "Receiver3");
    }
}

的AndroidManifest.xml:

    <receiver android:name="com.example.test.MainActivity$AlarmReceiver" >
    </receiver>

BenLambell代码的问题:

  • 或者:
    • 将接收器移动到它自己的.java文件或
    • 使内部类静态 - 因此可以从外部访问
  • 清单中未正确声明接收方:
    • 如果它是MainActivity中的内部类使用: <receiver android:name="package.name.MainActivity$AlarmReceiver" ></receiver>
    • 如果它在一个单独的文件中: <receiver android:name="package.name.AlarmReceiver" ></receiver>

如果您打算在接收者的onReceive(像我一样)中显示一个对话框:那是不允许的 - 只有活动可以启动对话框。这可以通过dialog activity实现。

您可以使用AlarmManager直接调用活动:

Intent intent = new Intent(MainActivity.this, TriggeredActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this, 0, intent, PendingIntent.FLAG_ONE_SHOT);
((AlarmManager) getSystemService(ALARM_SERVICE)).set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + seconds * 1000, pendingIntent);

答案 1 :(得分:4)

  

如何使用AlarmManager(在Android API中)在给定时间启动活动?

PendingIntent来电中提供set()来识别要启动的活动。或者,做你正在做的事情,这应该可以正常工作。

This sample project有点复杂,因为它是我的一本书中的19本教程,但是如果你看一下像EditPreferencesOnBootReceiverOnAlarmReceiver这样的课程,您将看到上面使用的相同基本配方。在这种情况下,我可能刚刚使用了getActivity() PendingIntent,但是在此之后的教程为用户提供了启动活动或显示Notification的选择,因此{{1更有意义。

除了LogCat中的错误外,还要查找警告。最有可能的是,您的接收者或活动不在您的清单中。

请注意,从不知名的地方弹出活动通常不是一个好主意。从有问题的书中引用自己:

  

通过全屏活动显示午餐时间报警当然有效,   如果用户正在看屏幕,它会引起他们的注意。然而,   如果碰巧正在使用手机那么它也是相当具有破坏性的   瞬间。例如,如果他们在开车时键入文字信息,那么您的   警报活动突然冒出来可能会分散他们的注意力   引发事故。因此,为了公共安全,我们应该给用户一个选择   有一种更微妙的方式来提醒他们共进午餐。

答案 2 :(得分:1)

在你的androidmanifest文件中添加它,它将有希望工作

<activity android:name=".MyReceiver" />
        <receiver android:name=".MyReceiver"> </receiver>

答案 3 :(得分:1)

根据我的经验,您可以在没有广播接收器的情况下实现此目标,只需使用PendingIntent.getActivity()而不是getbroadcast()

private void setReminder(){

AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
            Calendar startTime = Calendar.getInstance();
            startTime.add(Calendar.MINUTE, 1);
            Intent intent = new Intent(ReminderActivity.this, ReminderActivity.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            PendingIntent pendingIntent = PendingIntent.getActivity(ReminderActivity.this, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);
            alarmManager.set(AlarmManager.RTC, startTime.getTimeInMillis(), pendingIntent);   
}

我已在android O上测试了此代码,但不确定其他android版本,如果此操作不适用于其他任何android版本,请通知我。

答案 4 :(得分:0)

根据Java约定类名称以大写字母开头。所以改变你的

"myReceiver" to "MyReceiver" and  "myActivity" to "MyActivity".

然后在清单文件中添加您的接收器,如下所示。

<application 
------------
<receiver android:name="MyReceiver"></receiver>
---------------------
</application>

答案 5 :(得分:0)

你没有向接收器发送接收器的任何广播,而且更多的是它像你想要一个闪屏或类似的东西为此目的你可以开始一个新的线程等待一段时间然后开始你的活动在那里和为那段时间你可以在UI线程上做你想做的事......

答案 6 :(得分:0)

主要问题::如果您完全关闭自己的应用,并希望在3秒钟后开始活动,那么您错了。因为当您关闭应用时,您无法接收广播,因此为解决此问题,请使用服务代替广播。

要点::服务运行时,如果您的应用程序不在前台,就无法启动活动。

解决方案:我想当您启动服务时,您可以再次设置Alarmmanager使用PendingIntent来开始您的活动,现在

记住

  1. 创建将其传递给pendingIntent的意图时,请向其中添加FLAG_ACTIVITY_NEW_TASK
  2. 对此PendingIntent使用PendingIntent.getActivity()方法,对于第一个PendingIntent使用PendingIntent.getService()方法。

希望对您有帮助。

答案 7 :(得分:0)

我很早以前就遇到了这个问题,不知道哪个答案是正确的,但是感谢大家的回答。我正在自我回答,所以问题仍然没有解决。