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

Ben*_*ell 10 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

任何意见,将不胜感激.

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

Dea*_*tov 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");
    }
}
Run Code Online (Sandbox Code Playgroud)

AndroidManifest.xml中:

    <receiver android:name="com.example.test.MainActivity$AlarmReceiver" >
    </receiver>
Run Code Online (Sandbox Code Playgroud)

BenLambell代码的问题:

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

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

您可以使用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);
Run Code Online (Sandbox Code Playgroud)


jai*_*nal 0

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

"myReceiver" to "MyReceiver" and  "myActivity" to "MyActivity".
Run Code Online (Sandbox Code Playgroud)

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

<application 
------------
<receiver android:name="MyReceiver"></receiver>
---------------------
</application>
Run Code Online (Sandbox Code Playgroud)