Android - получите ценность от Сервиса и используйте его в Виджете - PullRequest
0 голосов
/ 28 мая 2018

Я занимаюсь разработкой простого C# приложения для Android, которое работает в фоновом режиме и выполняет определенные вычисления. У меня также есть виджет с TexTview, в котором я хочу отобразить результат вычисления.

Service.cs

Intent intent = new Intent("TEST");
intent.PutExtra("alltotale", total.ToString());
this.SendBroadcast(intent);

Затем в классе BroadcastReceiver у меня есть:

Receiver.cs

 public override void OnReceive(Context context, Intent intent)
    {
        string nh = intent.GetStringExtra("alltotale");
        Toast.MakeText(context, nh, ToastLength.Short).Show();
    }

Теперь я хочу повторно использовать это значение и отобразить его в виджете TextView, но он не работает, я ничего не получаю в своем Widget.

AppWidget.cs

[BroadcastReceiver(Label = "Widget1")]
[IntentFilter(new string[] { "android.appwidget.action.APPWIDGET_UPDATE" })]
[MetaData("android.appwidget.provider", Resource = "@xml/appwidgetprovider")]
public class AppWidget : AppWidgetProvider
{
    Intent intent;
    public override void OnUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
    {
        var me = new ComponentName(context, Java.Lang.Class.FromType(typeof(AppWidget)).Name);
        appWidgetManager.UpdateAppWidget(me, BuildRemoteViews(context, appWidgetIds));

    }
    private RemoteViews BuildRemoteViews(Context context, int[] appWidgetIds)
    {
        var widgetView = new RemoteViews(context.PackageName, Resource.Layout.Widget);

        SetTextViewText(widgetView);
        RegisterClicks(context, appWidgetIds, widgetView);

        return widgetView;
    }
    private void SetTextViewText(RemoteViews widgetView)
    {
        string oo = intent.GetStringExtra("alltotale");
        widgetView.SetTextViewText(Resource.Id.widgetMedium, "Dabboussi");
        widgetView.SetTextViewText(Resource.Id.widgetSmall, oo);
    }
    private static string AnnouncementClick = "AnnouncementClickTag";
    private void RegisterClicks(Context context, int[] appWidgetIds, RemoteViews widgetView)
    {
        var intent = new Intent(context, typeof(AppWidget));
        intent.SetAction(AppWidgetManager.ActionAppwidgetUpdate);
        intent.PutExtra(AppWidgetManager.ExtraAppwidgetIds, appWidgetIds);

        // Register click event for the Background
        var piBackground = PendingIntent.GetBroadcast(context, 0, intent, PendingIntentFlags.UpdateCurrent);
        widgetView.SetOnClickPendingIntent(Resource.Id.widgetAnnouncementIcon, GetPendingSelfIntent(context, AnnouncementClick));
    }
    private PendingIntent GetPendingSelfIntent(Context context, string action)
    {
        var intent = new Intent(context, typeof(AppWidget));
        intent.SetAction(action);
        return PendingIntent.GetBroadcast(context, 0, intent, 0);
    }
    public override void OnReceive(Context context, Intent intent)
    {
        base.OnReceive(context, intent);
        var data = intent.GetStringExtra("alltotale");

        if (data != null)
        {
            var updateViews = new RemoteViews(context.PackageName, Resource.Layout.Widget);
            SetTextViewText(updateViews);
            ComponentName thisWidget = new ComponentName(context, Java.Lang.Class.FromType(typeof(AppWidget)).Name);
            AppWidgetManager manager = AppWidgetManager.GetInstance(context);
            manager.UpdateAppWidget(thisWidget, updateViews);
        }
        if (AnnouncementClick.Equals(intent.Action))
        {
            Toast.MakeText(context, "OPEN", ToastLength.Short).Show();
            // Open another app
        }
    }
}

Итак, значение отображается в сообщении Toast в фоновом режиме, но ничего в виджете textview.Почему это так и как я могу это решить?

Редактировать

Я думал, что, возможно, ISharedPreferences справится, поэтому я сделал следующее:

Service.cs

Intent priceIntent = new Intent("com.xamarin.example.TEST");
priceIntent.PutExtra("alltotale", total.ToString());
this.SendBroadcast(priceIntent);
ISharedPreferences prSer = PreferenceManager.GetDefaultSharedPreferences(this);
ISharedPreferencesEditor prEd = prSer.Edit();
prEd.PutInt("PriceTot", Convert.ToInt32(total));

, затем в файле AppWidget.cs я сделал следующее:

  [BroadcastReceiver(Label = "Widget1")]
  [IntentFilter(new string[] { "android.appwidget.action.APPWIDGET_UPDATE", "com.xamarin.example.TEST" })]
[MetaData("android.appwidget.provider", Resource = "@xml/appwidgetprovider")]
public class AppWidget : AppWidgetProvider
{
    Intent intent;
    public override void OnUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
    {
        var me = new ComponentName(context, Java.Lang.Class.FromType(typeof(AppWidget)).Name);
        appWidgetManager.UpdateAppWidget(me, BuildRemoteViews(context, appWidgetIds));

    }
    private RemoteViews BuildRemoteViews(Context context, int[] appWidgetIds)
    {
        var widgetView = new RemoteViews(context.PackageName, Resource.Layout.Widget);

        //SetTextViewText(widgetView);
        RegisterClicks(context, appWidgetIds, widgetView);

        return widgetView;
    }
    private void SetTextViewText(RemoteViews widgetView)
    {
            widgetView.SetTextViewText(Resource.Id.widgetMedium, "Don Dabboussi");
            widgetView.SetTextViewText(Resource.Id.widgetSmall, "KK");
   }
    private static string AnnouncementClick = "AnnouncementClickTag";
    private void RegisterClicks(Context context, int[] appWidgetIds, RemoteViews widgetView)
    {
        var intent = new Intent(context, typeof(AppWidget));
        intent.SetAction(AppWidgetManager.ActionAppwidgetUpdate);
        intent.PutExtra(AppWidgetManager.ExtraAppwidgetIds, appWidgetIds);

        // Register click event for the Background
        var piBackground = PendingIntent.GetBroadcast(context, 0, intent, PendingIntentFlags.UpdateCurrent);
        //widgetView.SetOnClickPendingIntent(Resource.Id.widgetAnnouncementIcon, GetPendingSelfIntent(context, AnnouncementClick));
    }
    private PendingIntent GetPendingSelfIntent(Context context, string action)
    {
        var intent = new Intent(context, typeof(AppWidget));
        intent.SetAction(action);
        return PendingIntent.GetBroadcast(context, 0, intent, 0);
    }
    public override void OnReceive(Context context, Intent intent)
    {
        base.OnReceive(context, intent);
        ISharedPreferences prSer = PreferenceManager.GetDefaultSharedPreferences(context);
        var data = prSer.GetInt("PriceTot", 0);
        if (data != 0)
        {
            var updateViews = new RemoteViews(context.PackageName, Resource.Layout.Widget);
            SetTextViewText(updateViews);
            ComponentName thisWidget = new ComponentName(context, Java.Lang.Class.FromType(typeof(AppWidget)).Name);
            AppWidgetManager manager = AppWidgetManager.GetInstance(context);
            manager.UpdateAppWidget(thisWidget, updateViews);
        }
        if (AnnouncementClick.Equals(intent.Action))
        {
            Toast.MakeText(context, "OPEN", ToastLength.Short).Show();
            // Open another app
        }
    }

Ноэто не сработало, в виджетах в моем виджете нет текста (нет dabboussi и нет kk).Почему это так?

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Вам нужно получить AppWidgetManager и вызвать метод UpdateAppWidget() для обновления виджета.

Например:

    public override void OnReceive(Context context, Intent intent)
    {
        base.OnReceive(context, intent);

        var data = intent.GetStringExtra("alltotale");

        if(data != null)
        {
            var updateViews = new RemoteViews(context.PackageName, Resource.Layout.widget);
            SetTextViewText(updateViews, intent);
            // Push update for this widget to the home screen
            ComponentName thisWidget = new ComponentName(context, Java.Lang.Class.FromType(typeof(MyWidget)).Name);
            AppWidgetManager manager = AppWidgetManager.GetInstance(context);
            manager.UpdateAppWidget(thisWidget, updateViews);
        }
    }

    private void SetTextViewText(RemoteViews widgetView, Intent intent)
    {
        string oo = intent.GetStringExtra("alltotale");
        widgetView.SetTextViewText(Resource.Id.widgetMedium, "Dabboussi");
        widgetView.SetTextViewText(Resource.Id.widgetSmall, oo);
    }

И вы можете обратиться кэто официальная демоверсия для получения дополнительной информации.

0 голосов
/ 28 мая 2018

Вы помещаете строку с именем alltotale и запрашиваете строку с именем widgetTotale, поэтому это нормально, если она не работает.Вы должны изменить widgetTotale на alltotale

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...