简体   繁体   English

Xamarin Android中具有BroadcastReceiver的通知中的呼叫服务方法

[英]Call service method from notification with BroadcastReceiver in Xamarin Android

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. 当我按下“ WSTRZYMAJ”按钮时,我想从我的服务中调用PauseDownload()方法。 How can I do this? 我怎样才能做到这一点? I have read about BroadcastReceiver, create this class but how to call method from service from BroadcastReceiver class? 我已经阅读了BroadcastReceiver,创建了这个类,但是如何从BroadcastReceiver类的服务中调用方法呢?

Screen from notification: 通知屏幕: 通知

Fragment of my service: 我的服务片段:

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
    }
}

And full code BroadcastReceiver class: 以及完整的代码BroadcastReceiver类:

[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
    }
}

how to call method from service from BroadcastReceiver class? 如何从BroadcastReceiver类的服务中调用方法?

When you receive message in DownloadsBroadcastReceiver , you could start your DownloadsService again. 当您在DownloadsBroadcastReceiver收到消息时,可以再次启动DownloadsService 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. 完成此操作后,由于已创建DownloadsService ,它将调用OnStartCommand()方法,因此您将在此方法中收到消息,可以在OnStartCommand()方法中调用PauseDownload()

Usage like this : 用法如下:

[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);
        }
    }
}

In your DownloadsService class : 在您的DownloadsService类中:

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

     ...
     return StartCommandResult.NotSticky;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM