2013-06-24 53 views
0

我的應用部件有問題/問題。我創建了一個帶有6個按鈕的應用程序小部件,我用6個動作(在清單和onUpdate()方法中)將這6個按鈕組合起來。如果用戶按下其中一個我可以對此作出反應的原因。但在默認時間後,我沒有得到迴應,聽起來像appwidgetmanager不工作。Android應用部件的生存期

的問題是,如果我將設備連接到它的工作原理例如PC。 1周,但是當我以正常方式使用智能手機(我沒有將其與電腦連接,我使用它一整天),appwidget沒有響應,按鈕沒有迴應。

的窗口小部件必須只顯示一些文本,爲此,我禁用updateperiod - >的appwidget只運行一次在的onUpdate()方法。

現在的問題:我必須實現updateperiod,我可以證明該appwidget在一天結束時或靜止的生命是一個其他問題/問題?

問候 馬努

回答

2

這是設置在updatePeriodMillis像900000毫秒是一個好主意。這將每15分鐘調用一次onUpdate方法。在onUpdate方法中,您可以「刷新」遠程視圖的未決意圖。您可以做的另一件事是每次更改遠程視圖時執行小部件更新。例如,用戶按下按鈕就可以做你必須做的事情,然後執行小部件更新。

有很多原因會導致掛起的意圖被系統破壞,從而導致您的遠程視圖死機,並且所有這些視圖都很難找到並理解,因此最佳做法是一次更新您的小部件。

我的研究表明,15分鐘是一個很好的時間框架。例如,這是一個運行,每15分鐘有許多按鈕的控件我的onUpdate方法:

和FullWidgetUpdate方法是這樣的:

... 
    views.setInt(R.id.cmdwifi, "setBackgroundResource", ThemeResources.getThemeResource(themeId, R.drawable.btn_bck_topleft_black)); 
    views.setInt(R.id.cmdbluetooth, "setBackgroundResource", ThemeResources.getThemeResource(themeId, R.drawable.btn_bck_middle_black)); 
    views.setInt(R.id.cmddata, "setBackgroundResource", ThemeResources.getThemeResource(themeId, R.drawable.btn_bck_middle_black)); 
    views.setInt(R.id.cmdsync, "setBackgroundResource", ThemeResources.getThemeResource(themeId, R.drawable.btn_bck_middle_black)); 
    views.setInt(R.id.cmdflight, "setBackgroundResource", ThemeResources.getThemeResource(themeId, R.drawable.btn_bck_middle_black)); 
    views.setInt(R.id.cmdgps, "setBackgroundResource", ThemeResources.getThemeResource(themeId, R.drawable.btn_bck_middle_black)); 
    views.setInt(R.id.cmdorientation, "setBackgroundResource", ThemeResources.getThemeResource(themeId, R.drawable.btn_bck_middle_black)); 
    views.setInt(R.id.cmdvolume, "setBackgroundResource", ThemeResources.getThemeResource(themeId, R.drawable.btn_bck_topright_black)); 
... 
     final int PendingIntentFLAG = PendingIntent.FLAG_UPDATE_CURRENT; 

    Intent iWiFi = new Intent(cx, CommandsReceiver.class).setAction(CommandsReceiver.cmdwifi).setData(Uri.parse("custom:" + widgetID)); 
    PendingIntent piWiFi = PendingIntent.getBroadcast(cx, 0, iWiFi, PendingIntentFLAG); 
    views.setOnClickPendingIntent(R.id.cmdwifi, piWiFi); 

    Intent iBT = new Intent(cx, CommandsReceiver.class).setAction(CommandsReceiver.cmdbt).setData(Uri.parse("custom:" + widgetID)); 
    PendingIntent piBT = PendingIntent.getBroadcast(cx, 0, iBT, PendingIntentFLAG); 
    views.setOnClickPendingIntent(R.id.cmdbluetooth, piBT); 
... and so on for other buttons .... 

希望這有助於...

+0

非常感謝你的詳細答案。但有人認爲:每15分鐘更新一次,我有點害怕記憶力衰退,你有什麼經驗,你不必擔心嗎? –

+0

內存泄漏是錯誤代碼造成的,而不是更新時間。只要你的代碼有效率和小,你沒有什麼可擔心的。如果您的小部件在用戶與它交互時有許多事情要做,那麼您必須使用服務,但這完全是另一回事。在用戶按下按鈕的情況下,如果您正在更改某些視圖的可見性,則可以使用15分鐘的方法進行操作。沒必要擔心小部件的更新時間,但最常見的小部件是那些時鐘每分鐘更新一次而沒有明顯資源消耗的小部件。 – Christos

0

你更新的微件每個視圖每次更新的意見,一次?

我最後一次檢查,你不得不更新每一個觀看每次否則意見將最終變得反應遲鈍遲早的事。換句話說,如果您有6個按鈕和2個文本視圖,並且您想要更新其中一個文本視圖,則還需要更新其他文本視圖和按鈕(以及您之前發送給他們的相同信息)。

它可能會或可能不會在Android的一個bug,但它的事情是這樣的。

+0

不,我不更新每個視圖。我可能會想象...如果用戶按btn 1,那麼我填充文本1並設置文本2,3,4,5,6的可見性消失,另一個我以相同的方式。 btn2 - > text2 - >可見 - >文字1,3,4,5,6沒了。如果這是一個錯誤...我不這麼認爲,導致其他應用程序小部件可以在那裏管理一生... –

相關問題