设备断电后恢复警报

时间:2015-04-17 13:38:36

标签: android android-service persistence boot

我想我已经把自己编成了一个角落。但我会尽力解释我的问题。基本上我在android上构建一个应用程序应该是手机上的警报应用程序的副本。我有一个代表警报的对象。它包括时间,以及作为布尔等的日子。我通过序列化它们并将它们保存到文件来持久存储这些对象。然后,在启动时,我有一个广播记录器启动启动服务。基本上,bootservice有一个循环遍历我的警报列表。我试图在每个报警对象上调用一个名为" setSysAlarm()"的方法,它应该在保存的时间重新创建每个android系统报警。目前," setSystemAlarm"方法只是为测试目的创建一个toast。但这导致应用程序崩溃。我的设计显然存在缺陷,我认为尝试使用应用程序上下文会导致崩溃。我的想法是,我应该在运行时通过GUI通过服务创建所有警报,以及在启动时重新创建警报?因此,无论应用程序运行在何处,都可以创建警报,还可以在一个地方创建警报?下面是我在引导时执行的引导服务代码。

public class BootService extends Service {

   private Thread setallarams;
   private file_acces_int  fileaccess;
   private ArrayList<alarm_entity> alarmlst;


   private Runnable setalarmsrunnable = new Runnable() {
   @Override
   public void run()
   {
    for(alarm_entity alarm : alarmlst)
       {
            alarm.setSystemAlarm();
       }
    }
  };

@Override
public void onCreate()
{
    fileaccess = new file_access_model(getApplicationContext());
    alarmlst = fileaccess.readFromFile();
    setallarams = new Thread(setalarmsrunnable);
    cont = this;
}

@Override 
public int onStartCommand(Intent intent, int flags, int startId)
{

    setallarams.start();

    try {
        setallarams.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    stopSelf();
    return START_STICKY;

}

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


}

这是我的alarm_entity类的setSystemAlarm()方法。基本上这是为了在启动时创建一个吐司,但目前应用程序正在崩溃

public void setSystemAlarm()
{
       Toast.makeText(cont, "hi there", Toast.LENGTH_SHORT);
}

如果有人可以帮助我,我会感激它。我用来获取上下文的方法是 1.从bootService传入它。对我来说似乎不可行吗? 2.在每个alarm_entity的构造函数中创建Application的实例并将其用作上下文。这对我来说似乎也很愚蠢。洛尔

无论如何,提前感谢并抱歉这个冗长的问题!

2 个答案:

答案 0 :(得分:0)

将此权限添加到您的清单

> android.permission.RECEIVE_BOOT_COMPLETED

答案 1 :(得分:0)

无论如何,我们已经讨论了如何获得Logcat输出:)。基本问题是,为什么会出现此错误。也许这不是完整的答案,但我需要展示一些代码。您正在服务的onCreate()内初始化您的上下文:

    @Override
     public void onCreate()
 {
fileaccess = new file_access_model(getApplicationContext());
alarmlst = fileaccess.readFromFile();
setallarams = new Thread(setalarmsrunnable);
cont = this;
 }

但是像API中描述的那样:

  

请勿直接调用此方法。

我不知道这是否是你崩溃的原因,我们没有Logcat,可能是任何其他原因。但建议您在onStartCommand()中进行初始化,因此请将初始化设置在onStartComand()

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId)
   {

 fileaccess = new file_access_model(getApplicationContext());
alarmlst = fileaccess.readFromFile();
setallarams = new Thread(setalarmsrunnable);
setallarams.start();

            .
            .
            .

另一件事是,我看不到初始化alarm_entity类,也许我是盲人(?),但是我无法看到你将一个上下文传递给这个类。例如,如果您正在初始化此类,则必须在您的onStartCommand()中包含类似的内容;

     mAlarm_entity = new alarm_entity(this);

因为服务保留了上下文,所以只需调用this即可。删除onCreate(),然后您不需要初始化上下文,因为该服务已全部完成。