Xamarin Android中具有BroadcastReceiver的通知中的呼叫服务方法 [英] Call service method from notification with BroadcastReceiver in Xamarin Android

查看:258
本文介绍了Xamarin Android中具有BroadcastReceiver的通知中的呼叫服务方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我启动服务并创建新线程(下载大文件).同时,我显示一个带有操作的通知(暂停按钮). 当我按下"WSTRZYMAJ"按钮时,我想从服务中调用PauseDownload()方法.我该怎么做?我已经阅读了BroadcastReceiver,创建了这个类,但是如何从BroadcastReceiver类的服务中调用方法呢?

I start a service and create new thread (downloading a large file). At the same time I display a notification with action (pause button). When I press this button "WSTRZYMAJ" I want call PauseDownload() method from my service. How can I do this? I have read about BroadcastReceiver, create this class but how to call method from service from BroadcastReceiver class?

通知屏幕:

我的服务片段:

class DownloadsService : Service
{
    DownloadsBroadcastReceiver receiver;
    Notification.Builder notificationBuilder;
    DownloadsData downloadsData;
    int uniqueNumber = 1000;
    bool isStarted;

    public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)
    {
        RegisterReceiver(receiver, new IntentFilter("com.xamarin.example.TEST"));
        downloadsData = JsonConvert.DeserializeObject<DownloadsData>(intent.GetStringExtra("downloadsData"));
        if (isStarted)
            Log.Info("DAMIAN", "Error start service");
        else
        {
            Log.Info("DAMIAN", "Start service");
            DispatchNotificationThatServiceIsRunning(downloadsData.Name, "Started");
            new Thread(new ThreadStart(() =>
            {
                MakeDownload();
            })).Start();
            isStarted = true;
        }
        return StartCommandResult.NotSticky;
    }

    private void DispatchNotificationThatServiceIsRunning(string title, string content)
    {
        Intent stopIntent = new Intent(this, typeof(DownloadsBroadcastReceiver));
        stopIntent.PutExtra("action", "actionName");
        PendingIntent stopPi = PendingIntent.GetBroadcast(this, 4, stopIntent, PendingIntentFlags.UpdateCurrent);
        Intent intent = new Intent(this, typeof(MainActivity));
        TaskStackBuilder stackBuilder = TaskStackBuilder.Create(this);
        stackBuilder.AddParentStack(Java.Lang.Class.FromType(typeof(MainActivity)));
        stackBuilder.AddNextIntent(intent);
        PendingIntent resultPendingIntent = stackBuilder.GetPendingIntent(0, PendingIntentFlags.UpdateCurrent);
        Notification.Action pauseAction = new Notification.Action.Builder(Resource.Drawable.Pause, "WSTRZYMAJ", stopPi).Build();
        notificationBuilder = new Notification.Builder(this)
            .SetSmallIcon(Resource.Drawable.Icon)
            .SetContentIntent(resultPendingIntent)
            .SetContentTitle(title)
            .SetContentText(content)
            .AddAction(pauseAction);
        var notificationManager = (NotificationManager)GetSystemService(NotificationService);
        notificationManager.Notify(uniqueNumber, notificationBuilder.Build());
    }

    private void UpdateNotification(string content)
    {
        notificationBuilder.SetContentText(content);
        var notificationManager = (NotificationManager)GetSystemService(NotificationService);
        notificationManager.Notify(uniqueNumber, notificationBuilder.Build());
    }

    private void MakeDownload()
    {
    //downloading file
    }

    private void PauseDownload()
    {
    //pause downloading
    }
}

以及完整的BroadcastReceiver类代码:

And full code BroadcastReceiver class:

[BroadcastReceiver(Enabled = true, Exported = false)]
[IntentFilter(new[] { "com.xamarin.example.TEST" })]
class DownloadsBroadcastReceiver : BroadcastReceiver
{
    public override void OnReceive(Context context, Intent intent)
    {
        String action = intent.GetStringExtra("action");
        if (action.Equals("actionName"))
            Log.Info("DAMIAN", "BROADCAST"); //it works, ie. I have text "BROADCAST" in log
    }
}

推荐答案

如何从BroadcastReceiver类的服务中调用方法?

how to call method from service from BroadcastReceiver class?

当您在DownloadsBroadcastReceiver中收到消息时,可以再次启动DownloadsService.完成此操作后,由于已创建DownloadsService,它将调用 OnStartCommand ()方法,因此您将在此方法中收到消息,您可以在OnStartCommand()方法中调用PauseDownload().

When you receive message in DownloadsBroadcastReceiver, you could start your DownloadsService again. When you did this, since your DownloadsService has been created, it will call OnStartCommand() method, so you will receive message in this method, you could call PauseDownload() in OnStartCommand() method.

这样的用法:

[BroadcastReceiver(Enabled = true, Exported = false)]
[IntentFilter(new[] { "com.xamarin.example.TEST" })]
public class DownloadsBroadcastReceiver : BroadcastReceiver
{
    public override void OnReceive(Context context, Intent intent)
    {
        String action = intent.GetStringExtra("action");
        if ("actionName".Equals(action))
        {
            Intent intent2 = new Intent(Application.Context, typeof(DownloadsService));
            intent2.PutExtra(action, "actionName");

            Application.Context.StartService(intent2);
        }
    }
}

在您的DownloadsService类别中:

public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)
{
     String action = intent.GetStringExtra("action");
     if ("actionName".Equals(action))
     {
        PauseDownload();
     }

     ...
     return StartCommandResult.NotSticky;
}

这篇关于Xamarin Android中具有BroadcastReceiver的通知中的呼叫服务方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆