我想在我的项目中实现一个日程安排功能。所以我在谷歌上搜索了一个闹钟管理程序,但我找不到任何例子。
有人能帮我编写一个基本的报警管理器程序吗?
发布于 2012-01-10 18:45:34
这是工作代码。它每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);
}
}
}发布于 2013-04-20 18:35:21
我尝试了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只使用操作消息来创建类的实例要比依赖一些可能永远不会起作用的可疑上下文要好得多。
发布于 2012-08-26 03:24:07
这里有一个相当完整的例子。它会在5秒后将按钮变为红色。
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秒,然后回到你的应用程序,按钮将变成红色。
我不知道如果你的应用程序根本不在内存中,你会得到什么样的行为,所以要小心你试图保留的状态。
https://stackoverflow.com/questions/4459058
复制相似问题