2015-04-17 145 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()然後你不需要初始化上下文,因爲服務已經準備好了。