2014-03-28 24 views
2

我有一個問題非常類似於之前被問過的問題,但不完全一樣。參考文獻:1234最小的Android小部件,APPWIDGET_DELETED和APPWIDGET_DISABLED意圖永遠不會被接收

我已經編寫了一個最小的Android窗口小部件,以及APPWIDGET_DELETEDAPPWIDGET_DISABLED永遠不會被接收。

在上面的參考文獻1和2中,提出的解決方案是實施onReceive並明確查找這些意圖。不過,我在onReceive插入了一個日誌調用,並且可以確認這兩個意圖都不會出現,但APPWIDGET_UPDATEAPPWIDGET_ENABLED正如預期的那樣出現在日誌中。爲了仔細檢查這一點,我還插入了onDeletedonDisabled的最小實現,它們的主體僅由super的調用組成,它們的斷點放在它們上面,而這些決不會到達。

引用3似乎已經解決了他的問題,只需卸載並重新安裝他的應用程序,但這對我而言無效。事實上,我已經在多個仿真器圖像以及實際設備上嘗試了這一點,其中一些是新鮮的,之前從未有過之前的版本,並且此問題仍然存在。

根據參考文獻中的回覆說這些解決方法對他們有效,還有大量的在線教程使用了onDeletedonDisabled方法,但沒有提到它們實際上不起作用,我會假設我必須做錯事,而這在Android中並不是一個錯誤。

這是我最小的manifest文件:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.test.testwidgets"> 

    <application android:allowBackup="true" 
     android:label="@string/app_name" 
     android:icon="@drawable/ic_launcher" 
     android:theme="@style/AppTheme"> 

     <receiver android:label="Test Widget" 
        android:name="com.test.testwidgets.TestWidgetProvider" 
        android:exported="false"> 
      <intent-filter> 
       <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/> 
      </intent-filter> 
      <meta-data android:name="android.appwidget.provider" 
         android:resource="@xml/test_widget_info"/> 
     </receiver> 
    </application> 

</manifest> 

這裏是我最小的Java源:

public class TestWidgetProvider extends AppWidgetProvider { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.w("Schedule", "On receive " + intent.getAction()); 
     super.onReceive(context, intent); 
    } 

    @Override 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
     for (int widgetId : appWidgetIds) { 
      RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.test_widget); 
      appWidgetManager.updateAppWidget(widgetId, views); 
     } 
    } 

    @Override 
    public void onDeleted(Context context, int[] appWidgetIds) { 
     super.onDeleted(context, appWidgetIds); 
    } 

    @Override 
    public void onDisabled(Context context) { 
     super.onDisabled(context); 
    } 
} 
+1

擺脫'android:exported =「false」'。它的應用程序小部件不應該在那裏工作。您需要輸出此'',以便操作系統可以與之通話。 – CommonsWare

+0

謝謝!這樣做,如果你提供你的評論作爲答案,我會接受它! – AndroidSlinger

回答

4

AppWidgetProvider需要導出,這樣,協調的應用小部件的核心操作系統進程(主機和提供者之間)可以與它交談。因此,android:exported="false"是inapropos。

說實話,我本來並不期望與供應商合作,而不僅僅是一些事件。

相關問題