gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:29:51 24 4
gpt4 key购买 nike

关于这个问题,我已经查阅了十几个教程和论坛答案,但仍然无法将一些工作代码组合在一起。我会尽量让问题直截了当:

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

我为实现这一目标所做的最新尝试如下。

(省略了导入。我希望 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);
}
}

如有任何建议,我们将不胜感激。

请注意:我已经在 list 中有 myReceiver

最佳答案

以防其他人偶然发现这个 - 这里有一些工作代码(在 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 文件或
    • 使内部类成为静态的——这样它就可以从外部访问
  • 接收器未在 list 中正确声明:
    • 如果它是 MainActivity 中的内部类,请使用: <receiver android:name="package.name.MainActivity$AlarmReceiver" ></receiver>
    • 如果它在一个单独的文件中: <receiver android:name="package.name.AlarmReceiver" ></receiver>

如果您打算在接收者的 onReceive 中显示一个对话框(像我一样):那是不允许的 - 只有 Activity 才能启动对话框。这可以通过 dialog 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);

关于android - 你如何在 Android 中使用 AlarmManager 启动 Activity?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7050027/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com