2015-04-17 85 views
0

我想我已经将自己编码在这里的一个角落了。但我会尽我所能解释我的问题。基本上我正在android上构建一个应用程序,该应用程序应该是手机上的闹钟应用程序的副本。我有一个代表警报的对象。它包括时间和布尔等天。我坚持这些对象的序列化和保存到一个文件。然后,在启动时,我有一个启动启动服务的broadcastreciever。基本上bootservice有一个遍历我的警报列表的循环。 iam试图在每个报警对象上调用一个名为“setSysAlarm()”的方法,该方法应该在保存的时间重新创建每个android系统报警。目前,“setSystemAlarm”方法只是为了测试目的而创建一个敬酒。但是这导致应用程序崩溃。我的设计中显然存在缺陷,我认为尝试使用应用上下文会导致崩溃。我的想法是,我应该在运行时通过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的实例并将其用作上下文。这对我来说也很愚蠢。大声笑

无论如何感谢提前和抱歉的冗长的问题!

+3

请提供logcat输出,我们需要查看崩溃的原因。 – Opiatefuchs

+2

仅供参考,即使应用没有崩溃,您的Toast也不会出现,因为您忘记了.show().. – Opiatefuchs

+0

哦,该死的。无论如何,我不能得到在logcat,因为我必须重新启动设备重新加载在警报。 –

回答

0

此权限添加到您的清单

> android.permission.RECEIVE_BOOT_COMPLETED 
+0

已经在清单中。 –

+0

谢谢:) –

+0

这不提供问题的答案。要批评或要求作者澄清,请在其帖子下方留言。 – Joel

0

反正we've讨论太多,你怎么弄的logcat的输出:)。基本的问题是,为什么你会得到这个错误。也许这不是完整的答案,但我需要显示一些代码。要初始化你的服务的上下文中的onCreate():

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

但像API中描述:

不要直接调用此方法。

我不知道这是你的崩溃的原因,我们没有Logcat,它可能是其他原因。但it's推荐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类,也许我是个盲人,但我can'你无法看到你向这个班级传递了一个上下文。例如,如果您正在初始化此类,则它必须是您的onStartCommand()中的类似内容。

 mAlarm_entity = new alarm_entity(this); 

由于服务保持上下文,那么只需拨打this即可。删除onCreate()然后你不需要初始化上下文,因为服务已经准备好了。