警报管理器示例

2022-08-31 04:43:12

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

任何人都可以帮助我一个基本的报警管理器程序吗?


答案 1

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

添加到清单.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;
    }
}

如果要在手机启动时设置警报重复:

将权限和服务添加到清单.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);
        }
    }
}

答案 2

我尝试了XXX的解决方案,虽然它最初确实有效,但在某些时候它停止工作。再也没有被叫到。我花了几个小时试图弄清楚它可能是什么。我意識到的是,無論出於什麼神秘的原因,都不再被稱呼。为了解决这个问题,我发现您确实需要在清单中为接收方指定操作。例:onReceiveIntent

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

请注意,名称与句点一起。在 XXX 的方法中,按如下方式创建:".Alarm"setAlarmIntent

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

消息可以是您想要的任何内容。我只是为了给它起这个名字来演示。START_ALARM

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


推荐