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

9 浏览
0 Comments

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

我浏览了十几个关于这个问题的教程和论坛答案,但仍然无法编写出可工作的代码。我会尽量保持问题简单明了:\n如何使用AlarmManager(在Android API中)在指定的时间启动一个Activity?对于这个问题的任何解决方案都可以。\n我最近尝试的解决方法如下所示。\n(省略了导入部分。我期望MyActivity在程序打开后的3秒钟内启动,但实际上并没有。没有任何错误消息。)\n

public class AndroidTest2Activity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Context context = this;
        AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(context, myReceiver.class);
        PendingIntent pending = PendingIntent.getBroadcast(context, 0, intent, 0);
        manager.set(AlarmManager.RTC, System.currentTimeMillis() + 3000, pending);
        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);
    }
}

\n任何建议将不胜感激。\n请注意:我已经在清单文件中添加了myReceiver。

0
0 Comments

问题原因:在Android中使用AlarmManager启动Activity时,需要在Android清单文件中注册MyReceiver类。但是,提供的代码中仅包含了一个标签,并没有包含标签。

解决方法:在Android清单文件中,将提供的代码改为以下形式:

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

0
0 Comments

如何使用AlarmManager(Android API中的)在给定的时间启动一个Activity?

在调用set()时提供一个PendingIntent,该PendingIntent标识要启动的Activity。或者,继续你正在做的事情,这应该完全可以工作。

这个示例项目有点复杂,因为它是我书中的第19个教程,但是如果你查看像EditPreferences、OnBootReceiver和OnAlarmReceiver这样的类,你会看到你在上面使用的相同基本方法。在这种情况下,我本可以只使用一个getActivity() PendingIntent,但是在这之后的教程中,用户可以选择启动一个Activity或显示一个Notification,所以使用BroadcastReceiver更合理。

在LogCat中除了错误之外还要注意警告。很可能你的接收器或Activity没有在清单文件中声明。

请注意,突然弹出一个Activity通常不是一个好主意。引用自我在相关书籍中的说法:

通过全屏Activity显示午餐时间的闹钟当然是可以工作的,如果用户正在看屏幕,它会引起他们的注意。然而,如果他们正在开车时输入短信,你的闹钟Activity突然弹出可能会分散他们的注意力,导致事故发生。因此,为了公共安全起见,我们应该给用户提供一种更加微妙的方式来提醒他们吃午饭的选择。

谢谢快速回复 - 我已经看过你的教程了。我尝试替换Intent intent = new Intent(context, MyActivity.class); PendingIntent pending = PendingIntent.getActivity( context, 0, intent, 0 );但是仍然没有任何证据表明MyActivity在运行。然而,我确实得到了以下日志消息:(ActivityManager) Starting: Intent { flg=0x4 cmp=com.ben/.MyActivity (has extras) } from pid -1

然后有一个'No keyboard for id 0'的警告和一个'request time failed: Java.net.SocketException: Address family not supported by protocol'的调试消息。

这是否意味着MyActivity正在启动?如果是这样,为什么它的onCreate()不运行?

: 不清楚。如果Activity在清单文件中声明了,它应该会启动。也许它在onCreate()的某个地方崩溃了 - 你应该能看到一个堆栈跟踪。

为了双重检查,确保向AlarmManager的“set...”函数发送任何类型的PendingIntent都是可行的吗?希望是这样,否则封装将会被打破,但是Android文档非常明确地暗示它应该是一个广播Intent,并由BroadcastReceiver处理。这是误导吗?使用PendingIntent.getActivity()的结果似乎工作得很好,并给出了我想要的结果,但我想知道这是否是冒险的非正统做法,或者是否存在已知的非广播Intent的问题/风险。

: “这是误导吗?” - 如果你使用的是_WAKEUP闹钟,你对设备保持唤醒的唯一保证是它在调用onReceive()时保持唤醒。除了这种情况,我对使用getBroadcast() PendingIntent与AlarmManager相比其他任何类型的PendingIntent没有特别的魔法了解。

他们正在开车时输入短信?在驾车时,人们不应该使用他们的手机/平板电脑...

谢谢这个教程,对我来说,这个项目中有很多应用程序,我想知道如何将特定的文件夹分离成一个可安装的应用程序(单独的模块?),以便在物理设备上检查代码,我在任何地方都找不到关于如何实现这一点的信息。此外,许多依赖项,如Geo,在设置依赖项为Java 11和最低SDK为28时,在Android库中不存在某些原因。这个教程是从2013年的?所以我不明白...

: 上述示例代码是十年前的。我不建议直接尝试构建它。

谢谢,我想我需要再深入研究一下,这似乎是技术中的一个常见情况,关于技术规范知识的讨论在初始趋势高峰后会有一个短暂的高峰,然后这些信息就被埋没了。我本来期望的是,(Alarm API)在这一点上应该是一个易于使用的模块(我猜这是私下发生的,因此没有回音),但是检查文档时,它似乎仍然有点麻烦。更糟糕的是,界面一直在不断变化,我没有看到有人公开开发这个新接口,也许我只是懒惰...

0
0 Comments

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

问题的原因是BenLambell的代码存在一些问题:

1. 接收器(Receiver)没有正确声明在清单文件(AndroidManifest.xml)中,可以通过将其放在MainActivity的内部类中或者将内部类声明为静态类来解决。

2. 如果在Receiver的onReceive方法中想要显示对话框,是不被允许的,因为只有Activity可以启动对话框。可以使用对话框Activity来实现这个功能。

解决方法是直接使用AlarmManager来调用一个Activity:

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

直接使用AlarmManager来启动一个Activity能够在应用程序在后台或关闭的情况下启动或将其置于前台吗?我尝试了但没有成功。

0