从另一个类调用“ this”函数。最好的方法是什么?

时间:2018-11-07 09:50:59

标签: c# android

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

    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对象的另一个对象,但是该对象必须相同才能跳到下一个对象。如果不是,那么仅在第一首歌曲的上方播放另一首歌曲,这当然也不好。

最后,我不能仅仅将类作为参数传递给广播接收器的构造函数。那时我被告知,广播广播接收器需要有一个“标准构造函数”,所以我不能更改参数。

不幸的是,我相信这3个选项都是我所拥有的,而且似乎都不起作用。我确实真的不想做的是出于明显的原因将所有函数从主类复制粘贴到广播接收器中。

你们可以帮我吗? 谢谢!

3 个答案:

答案 0 :(得分:0)

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

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

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

这样做,您不必担心活动状态。调用全局BroadcastReceiver时,它将在应用程序内部广播消息,并且如果有某些接收者正在侦听消息,则将全部调用该消息,否则该消息将被忽略,没有任何错误,保留周期或崩溃。

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

答案 1 :(得分:0)

最简单的方法是从您的类中创建一个静态实例并触发函数:

    public static Activity_Player Instance;

然后在广播收录机中:

Instance.MYFUNCTION

答案 2 :(得分:-1)

如何在广播接收器上创建属性,然后使用该属性将引用传递给主类?

public class MyBroadcastReceiver
{
    // Constructor
    public MyBroadcastReceiver() {}

    // property 
    public MyMainClass {get;set;}
}

public MyMainClass 
{
    private void CreateBroadcastReceiver()
    {
        var br = new MyBroadcastReceiver();
        br.MyMainClass = this;
    } 
}