首页 > 解决方案 > 从另一个类调用“this”函数。什么是最好的方法?

问题描述

我正在开发一个播放音乐的应用程序。现在,我的主类中有一个函数,可以选择一首随机的新歌曲并播放该歌曲:

    private void ChooseRandomNewSongAndPlay(bool songHasCompleted)
    {
        Random rnd = new Random();
        int rndValue = rnd.Next(0, Mp3ObjectSmall.Count());
        int currentPos = 0;

        if (!songHasCompleted)
        {
            currentPos = mediaPlayer.CurrentPosition; // if song infact has completed, reset position to else save current position (when next has been pressed)
        }

        WriteSeekingToDataBase(currentPos, CurrentSongObject);
        mediaPlayer.Stop();

        if (Android.Net.Uri.Parse(CurrentSongObject.Mp3Uri) != null)
        {
            PhotoAlbumAdapter.OldSongUri = Android.Net.Uri.Parse(CurrentSongObject.Mp3Uri);
        }

        PhotoAlbumAdapter.NewSongUri = (Android.Net.Uri.Parse(Mp3ObjectSmall[rndValue].Mp3Uri));

        PlayMusic((Android.Net.Uri.Parse(Mp3ObjectSmall[rndValue].Mp3Uri)));
    }

但是我也设置了一个广播接收器,所以当用户在他的车里并点击汽车音响中的下一首歌时,我也希望播放上述功能。但问题是:

我无法创建上述函数public static,因为它调用了其他非静态函数。我也必须将它们设为静态,但这会导致许多其他错误,而且我认为这根本不是一个好的解决方案。

此外,我无法在广播接收器中创建我的主类的新对象:class xy = new class(). 我不能这样做,因为这也会创建我的 mediaplayer 对象的另一个对象,但是这个对象需要相同才能跳到下一个对象。如果不是,则只是在第一首歌曲之上播放另一首歌曲,这当然也不好。

最后,我不能只将类作为参数交给广播接收器的构造函数。然后我被告知广播接收器需要有一个“标准构造函数”,所以我无法更改参数。

不幸的是,我相信这三个选项都是我所拥有的,而且似乎都不起作用。我真的,真的不想做的是出于显而易见的原因将我的主类中的所有功能复制粘贴到广播接收器中。

你们能帮我吗?谢谢!

标签: c#android

解决方案


您没有指定广播接收器是活动本地广播接收器还是应用程序范围的广播接收器。

LocalBroadcastReceivers 可以创建为 Activity 的属性,让您在应用程序内广播消息,而经典的 BroadcastReceivers 可以让您响应来自应用程序外部的操作,即使您的应用程序已关闭。

如果你有一个 BroadcastReceiver,你可以在它接收到消息时,让它通过LocalBroacastManager重新发布消息。此外,您的活动必须设置一个处理该特定内部广播消息的LocalBroadcastReceiver 。

这样做,您不必担心 Activity 状态。当全局 BroadcastReceiver 被调用时,它会在应用程序内部广播消息,如果有一些接收者在监听它们将被全部调用,否则消息会被简单地忽略,没有错误、保留周期或崩溃。

我想你正在使用 Xamarin Android。您可以在此处获取有关接收器的完整文档 https://docs.microsoft.com/en-us/xamarin/android/app-fundamentals/broadcast-receivers


推荐阅读