首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >报警管理器示例

报警管理器示例
EN

Stack Overflow用户
提问于 2010-12-16 17:12:17
回答 11查看 354.9K关注 0票数 375

我想在我的项目中实现一个日程安排功能。所以我在谷歌上搜索了一个闹钟管理程序,但我找不到任何例子。

有人能帮我编写一个基本的报警管理器程序吗?

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2012-01-10 18:45:34

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

添加到Manifest.xml:

代码语言:javascript
复制
...
<uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>
...
<receiver android:process=":remote" android:name=".Alarm"></receiver>
...

类中的代码:

代码语言:javascript
复制
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);
    }
}

来自服务的设置警报:

代码语言:javascript
复制
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添加权限和服务:

代码语言:javascript
复制
<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>

并创建一个新类:

代码语言:javascript
复制
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);
        }
    }
}
票数 470
EN

Stack Overflow用户

发布于 2013-04-20 18:35:21

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

代码语言:javascript
复制
<receiver android:name=".Alarm" android:exported="true">
    <intent-filter>
        <action android:name="mypackage.START_ALARM" >
        </action>
    </intent-filter>
</receiver> 

请注意,该名称为".Alarm",并带有句点。在XXX的setAlarm方法中,按如下方式创建Intent

代码语言:javascript
复制
Intent i = new Intent("mypackage.START_ALARM");

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

我还没有见过在清单中定义的接收器没有指定操作的意图过滤器。按照XXX指定的方式创建它们似乎有点造假。通过指定操作名称,Android将被强制使用与该操作对应的类创建BroadcastReceiver的实例。如果你依赖于上下文,请注意Android有几个不同的对象,它们都被称为上下文,可能不会创建BroadcastReceiver。强迫Android只使用操作消息来创建类的实例要比依赖一些可能永远不会起作用的可疑上下文要好得多。

票数 60
EN

Stack Overflow用户

发布于 2012-08-26 03:24:07

这里有一个相当完整的例子。它会在5秒后将按钮变为红色。

代码语言:javascript
复制
    public void SetAlarm()
    {
        final Button button = buttons[2]; // replace with a button from your own UI
        BroadcastReceiver receiver = new BroadcastReceiver() {
            @Override public void onReceive( Context context, Intent _ )
            {
                button.setBackgroundColor( Color.RED );
                context.unregisterReceiver( this ); // this == BroadcastReceiver, not Activity
            }
        };

        this.registerReceiver( receiver, new IntentFilter("com.blah.blah.somemessage") );

        PendingIntent pintent = PendingIntent.getBroadcast( this, 0, new Intent("com.blah.blah.somemessage"), 0 );
        AlarmManager manager = (AlarmManager)(this.getSystemService( Context.ALARM_SERVICE ));

        // set alarm to fire 5 sec (1000*5) from now (SystemClock.elapsedRealtime())
        manager.set( AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 1000*5, pintent );
    }

但是请记住,即使您的应用程序没有运行,AlarmManager也会触发。如果你调用这个函数并点击Home按钮,等待5秒,然后回到你的应用程序,按钮将变成红色。

我不知道如果你的应用程序根本不在内存中,你会得到什么样的行为,所以要小心你试图保留的状态。

票数 28
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4459058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档