警报管理器示例

新手上路,请多包涵

我想在我的项目中实现一个计划功能。所以我在谷歌上搜索了一个警报管理器程序,但找不到任何示例。

谁能帮我做一个基本的报警管理器程序?

原文由 Rajamohan Sugumaran 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 499
2 个回答

这是工作代码。它每 10 分钟唤醒一次 CPU,直到手机关机。

添加到 Manifest.xml:

 ...
<uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>
...
<receiver android:process=":remote" android:name=".Alarm"></receiver>
...

你班级的代码:

 package yourPackage;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.PowerManager;
import android.widget.Toast;

public class Alarm extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
        PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "");
        wl.acquire();

        // Put here YOUR code.
        Toast.makeText(context, "Alarm !!!!!!!!!!", Toast.LENGTH_LONG).show(); // For example

        wl.release();
    }

    public void setAlarm(Context context)
    {
        AlarmManager am =( AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        Intent i = new Intent(context, Alarm.class);
        PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
        am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 60 * 10, pi); // Millisec * Second * Minute
    }

    public void cancelAlarm(Context context)
    {
        Intent intent = new Intent(context, Alarm.class);
        PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        alarmManager.cancel(sender);
    }
}

从服务设置警报:

 package yourPackage;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;

public class YourService extends Service
{
    Alarm alarm = new Alarm();
    public void onCreate()
    {
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId)
    {
        alarm.setAlarm(this);
        return START_STICKY;
    }

   @Override
   public void onStart(Intent intent, int startId)
    {
        alarm.setAlarm(this);
    }

    @Override
    public IBinder onBind(Intent intent)
    {
        return null;
    }
}

如果你想在手机开机时设置闹钟重复:

将权限和服务添加到 Manifest.xml:

 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>
...
<receiver android:name=".AutoStart">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"></action>
    </intent-filter>
</receiver>
...
<service
        android:name=".YourService"
        android:enabled="true"
        android:process=":your_service" >
</service>

并创建一个新类:

 package yourPackage;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class AutoStart extends BroadcastReceiver
{
    Alarm alarm = new Alarm();
    @Override
    public void onReceive(Context context, Intent intent)
    {
        if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED))
        {
            alarm.setAlarm(context);
        }
    }
}

原文由 XXX 发布,翻译遵循 CC BY-SA 4.0 许可协议

我尝试了 XXX 的解决方案,虽然它最初确实有效,但在某些时候它停止了工作。 onReceive 再也没有被调用过。我花了几个小时试图弄清楚它可能是什么。我开始意识到 Intent 出于某种神秘的原因不再被调用。为了解决这个问题,我发现您确实需要在清单中为接收者指定一个操作。例子:

 <receiver android:name=".Alarm" android:exported="true">
    <intent-filter>
        <action android:name="mypackage.START_ALARM" >
        </action>
    </intent-filter>
</receiver>

请注意,名称是 ".Alarm" 带句点。在XXX的 setAlarm 方法中,创建 Intent 如下:

 Intent i = new Intent("mypackage.START_ALARM");

START_ALARM 消息可以是任何你想要的。我只是出于演示目的给它起了这个名字。

我还没有看到清单中定义的接收器没有指定操作的意图过滤器。按照 XXX 指定的方式创建它们似乎有点虚假。通过指定动作名称,Android 将使用与动作对应的类强制创建 BroadcastReceiver 的实例。如果您依赖上下文,请注意 Android 有几个不同的对象,它们都称为上下文,可能不会导致创建您的 BroadcastReceiver 。强制 Android 仅使用操作消息创建您的类的实例比依赖一些可能永远无法工作的不确定上下文要好得多。

原文由 Johann 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题