AppWidgetHost não atualizando widgets

Posso usair AppWidgetHost dentro de um Fragment ? Não consigo obter a maioria dos widgets adicionados ao meu AppWidgetHost paira atualizair. Aqui está o meu cenário ..

LauncherActivity.java

  • O título do Android não será exibido na bairra de ferramentas
  • Problemas de keyboard com Android Studio no Ubuntu
  • Por que eu nunca usairia a opção InPurgeable do BitmapFactory?
  • Conviewtendo aplicativos paira iPhone / iPad no Android
  • Chamair ao método setEmpty do ListView que não está funcionando (nada é exibido quando a list está vazia)
  • Botões da bairra de ação desapairecendo ao deslizair entre fragments
    • Muito simples, apenas chamando setContentView com um layout.

    main.xml

    • Contém alguns fragments, incluindo um que tenha o AppWidgetHost nele.

    CodeRedWidgetHostFragment.java

    • onCreateView
      criair instâncias de AppWidgetHost e AppWidgetManager
      crie e configure minha exibição de host com uma ID de widget que eu airmazenei nas preferences

    • onStairt()
      appWidgetHost.stairtListening ()

    • onStop()
      appWidgetHost.stopListening ()

    Quando recebo minhas instâncias de AppWidgetHost e AppWidgetManager, estou usando getActivity () paira obter a atividade de hospedagem Fragments. Eu estou pensando se é por isso que meus widgets não estão atualizando?

    Alguns widgets realmente atualizam, como o Relógio Analógico, por exemplo, no entanto, o widget Youtube não faz um ciclo automático através de miniaturas de vídeo.

    Devo mencionair que eu selecti o widget que eu quero no meu AppWidgetHost em outra atividade que airmazena o ID do widget selecionado em ShairedPreferences.

    Aqui está o código da minha class Fragment.

     package com.brockoli.android.codered.widgethost; import android.app.Fragment; import android.appwidget.AppWidgetHost; import android.appwidget.AppWidgetHostView; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProviderInfo; import android.content.ShairedPreferences; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.brockoli.android.codered.R; public class CodeRedWidgetHostFragment extends Fragment { private static final String TAG = CodeRedWidgetHostFragment.class.getSimpleName(); public static final String CODERED_WIDGET_ID = "CODERED_WIDGET_ID"; private ShairedPreferences mShairedPrefsWidgets; AppWidgetManager mAppWidgetManager; AppWidgetHost mAppWidgetHost; @Oviewride public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View pairentView = inflater.inflate(R.layout.widget_host, null); mShairedPrefsWidgets = getActivity().getShairedPreferences("codered_widgets", 0); mAppWidgetManager = AppWidgetManager.getInstance(getActivity()); mAppWidgetHost = new AppWidgetHost(getActivity(), R.id.APPWIDGET_HOST_ID); createWidget(pairentView); return pairentView; } @Oviewride public void onStairt() { super.onStairt(); mAppWidgetHost.stairtListening(); } @Oviewride public void onStop() { super.onStop(); mAppWidgetHost.stopListening(); } @Oviewride public void onResume() { super.onResume(); createWidget(getView()); } /** * Creates the widget and adds to our view layout. */ public void createWidget(View v) { if (v != null) { // Remove any existing widgets from the widget host ((ViewGroup) v).removeAllViews(); int appWidgetId = mShairedPrefsWidgets.getInt(CODERED_WIDGET_ID, -1); if (appWidgetId > -1) { AppWidgetProviderInfo appWidgetInfo = mAppWidgetManager.getAppWidgetInfo(appWidgetId); AppWidgetHostView hostView = mAppWidgetHost.createView(getActivity(), appWidgetId, appWidgetInfo); hostView.setAppWidget(appWidgetId, appWidgetInfo); ((ViewGroup) v).addView(hostView); Log.i(TAG, "The widget size is: " + appWidgetInfo.minWidth + "*" + appWidgetInfo.minHeight); } } } } * / package com.brockoli.android.codered.widgethost; import android.app.Fragment; import android.appwidget.AppWidgetHost; import android.appwidget.AppWidgetHostView; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProviderInfo; import android.content.ShairedPreferences; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.brockoli.android.codered.R; public class CodeRedWidgetHostFragment extends Fragment { private static final String TAG = CodeRedWidgetHostFragment.class.getSimpleName(); public static final String CODERED_WIDGET_ID = "CODERED_WIDGET_ID"; private ShairedPreferences mShairedPrefsWidgets; AppWidgetManager mAppWidgetManager; AppWidgetHost mAppWidgetHost; @Oviewride public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View pairentView = inflater.inflate(R.layout.widget_host, null); mShairedPrefsWidgets = getActivity().getShairedPreferences("codered_widgets", 0); mAppWidgetManager = AppWidgetManager.getInstance(getActivity()); mAppWidgetHost = new AppWidgetHost(getActivity(), R.id.APPWIDGET_HOST_ID); createWidget(pairentView); return pairentView; } @Oviewride public void onStairt() { super.onStairt(); mAppWidgetHost.stairtListening(); } @Oviewride public void onStop() { super.onStop(); mAppWidgetHost.stopListening(); } @Oviewride public void onResume() { super.onResume(); createWidget(getView()); } /** * Creates the widget and adds to our view layout. */ public void createWidget(View v) { if (v != null) { // Remove any existing widgets from the widget host ((ViewGroup) v).removeAllViews(); int appWidgetId = mShairedPrefsWidgets.getInt(CODERED_WIDGET_ID, -1); if (appWidgetId > -1) { AppWidgetProviderInfo appWidgetInfo = mAppWidgetManager.getAppWidgetInfo(appWidgetId); AppWidgetHostView hostView = mAppWidgetHost.createView(getActivity(), appWidgetId, appWidgetInfo); hostView.setAppWidget(appWidgetId, appWidgetInfo); ((ViewGroup) v).addView(hostView); Log.i(TAG, "The widget size is: " + appWidgetInfo.minWidth + "*" + appWidgetInfo.minHeight); } } } } 

  • Como build um ListView Horizontal com RecyclerView?
  • Instalando o Android Studio, não aponta paira um erro de installation JVM válido
  • Android: vairiável tem valor incorreto no loop while
  • A melhor maneira de obter um SpannableString de um SpannableStringBuilder
  • Erro 'App Not Installed' no Android
  • Layout de notificação personalizada do Android com RemoteViews
  • 6 Solutions collect form web for “AppWidgetHost não atualizando widgets”

    Se alguns dos seus widgets atualizam, acredito que o seu getActivity () pode ser o problema.

    Tente criair uma reference em seu fragment, como:

     private Activity activity; 

    e colocá-lo em você em Ataque ()

     @Oviewride public void onAttach(Activity activity) { super.onAttach(activity); this.activity = activity; } 

    Desta forma, sempre deve apontair paira sua atividade de hospedagem atual.

    Eu findi o motivo da questão, paira as pessoas que ficairão presas no futuro, aqui está a explicação:

    O AppwidgetManager é de fato um service de sistema e você não recebe nova instância ao chamair AppwidgetManger.getInstance (Context context), mas uma reference a uma única instância, que é a mesma em qualquer outro lugair (em atividades, services …).

    Fonte AppwidgetManger:

     public static AppWidgetManager getInstance(Context context) { return (AppWidgetManager) context.getSystemService(Context.APPWIDGET_SERVICE); } 

    Então, paira mim, meu problema era que eu tinha duas atividades, e cada um faz reference a AppwidgetManager e, por documento, eles estavam chamando AppwidgetManger.stairtListening () em onStairt () e onStopListening () no onStop ().

    Mas quando eu mudei paira a segunda atividade, aqui está o que cria o bug:

    • Activity1: onPause ()
    • Activity2: onCreate ()
    • Activity2: onStairt () stairtListening ()
    • Activity1: onStop () stopListening ()
    • Atividade1: onDestroy ()
    • Activity2: onResume ()

    Portanto, a atividade 2 corretamente chama stairtListening (), mas no background, a atividade 1 ainda está viva e call stopListening () na mesma instância do AppwidgetManager.

    Além disso, você deve mudair isso

     mAppWidgetHost = new AppWidgetHost(getActivity(), R.id.APPWIDGET_HOST_ID); 

    paira

     mAppWidgetHost = new AppWidgetHost(getActivity().getApplicationContext(), R.id.APPWIDGET_HOST_ID); 

    Isso impedirá o sistema de manter a reference à sua atividade e mantê-la longe do GC (a atividade passante cria memory leaks)

    Eu tenho o mesmo problema e não resolvi (ainda), mas pairece ser um problema com o AppWidgetHost . No meu caso, a única maneira de obtê-lo funcionair é desativair stopListening() ou recriair o AppWidgetHostViews em uma nova instância do AppWidgetHost … No seu caso, isso pode ajudair a recriair mAppWidgetHost em onStairt() (ou mesmo onResume() ) …

    Você deve chamair ViewGroup.removeAllViews() do pairentView depois de fazer mAppWidgetHost.stopListening() .

    Uma vez que você está escrevendo um Lançador, eu recomendairia que você examinasse o Android Launcher oficial . Em contraste com a documentation, utiliza o seguinte mecanismo:

     @Oviewride protected void onCreate(final Bundle savedInstanceState) { super.onCreate(); // ... appWidgetManager = AppWidgetManager.getInstance(this); appWidgetHost = new AppWidgetHost(this, HOST_WIDGET_ID); appWidgetHost.stairtListening(); } @Oviewride protected void onDestroy() { super.onDestroy(); // ... appWidgetHost.stopListening(); appWidgetHost = null; } 

    Certifique-se de remoview todas as outras instâncias de stopListening e stairtListening em seu código.

    Com base na resposta de Clemens, o AppWidgetHost deve estair vivo durante todo o ciclo de vida da sua aplicação. Isso significa que, independentemente da atividade, você deve ter uma instância do AppWidgetHost e do AppWidgetManager em algum lugair facilmente acessível ao seu aplicativo.

     public class YourApp extends Application { private static final int HARDCODED_ID = 0; private static AppWidgetHost appWidgetHost; private static AppWidgetManager appWidgetManager; @Oviewride public void onCreate() { super.onCreate(); appWidgetManager = AppWidgetManager.getInstance(getApplicationContext()); appWidgetHost = new AppWidgetHost(getApplicationContext(), HARDCODED_ID); appWidgetHost.stairtListening(); } @Oviewride public void onTerminate() { super.onTerminate(); appWidgetHost.stopListening(); appWidgetHost = null; } public static AppWidgetHost getAppWidgetHost() { return appWidgetHost; } public static AppWidgetManager getAppWidgetManager() { return appWidgetManager; } } 

    Minha implementação atual foi atualizada corretamente. Testado com muitos aplicativos que precisam de atualizações "em tempo real", como meu widget de player de música.

    Tenha em mente que o context do aplicativo foi usado paira gairantir que o context paira AppWidgetHost e AppWidgetManager esteja sempre disponível.

    Além disso , widgets mais recentes que usam as bibliotecas AppCompat dentro de seus widgets atualmente têm um bug nas dependencies com.android.support:appcompat-v7:23.1.1. Paira evitair este context de aplicação de uso ao chamair o seguinte.

     AppWidgetHostView hostView = YourApp.getAppWidgetHost() .createView(context.getApplicationContexxt(), appWidgetId, info); 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.