如何从Android中的多个活动中调用相同的服务实例

时间:2017-05-05 08:04:10

标签: c# android xamarin xamarin.android

我刚开始研究Xamarin并且无法绕过我的脑袋如何使多个Activity有一个引用相同的服务实例。

我从KeyPressedReceiver开始MainActivity并开始侦听按下的电源按钮。

当进行三次点击时,我正在调用服务方法InitCancelActivity,它开始播放mp3文件并打开CancelActivity

CancelActivity中有一个文本字段和一个按钮。当用户按下此按钮时,我希望文本字段中的值传递给GeneralService方法KillAlert

问题是如何从GeneralService引用CancelActivity(已创建)的实例,以便我可以致电KillAlert

这部分

if (_service == null)
    _service = new GeneralService();

看起来绝对错误。我应该在MainActivity中实例化它并传递给KeyPressedReceiver构造函数吗?

[Activity(Label = "TTTT", MainLauncher = true, Icon = "@drawable/icon")]
public class MainActivity : Activity
{
    KeyPressedReceiver receiver;
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        SetContentView(Resource.Layout.Main);

        receiver = new KeyPressedReceiver();
        RegisterReceiver(receiver, new IntentFilter(Intent.ActionScreenOn));
    }
}


[BroadcastReceiver(Enabled = true)]
public class KeyPressedReceiver : BroadcastReceiver
{
    private GeneralService _service;
    private int _clicks = 0;
    public override void OnReceive(Context context, Intent intent)
    {
         if (_service == null)
            _service = new GeneralService();

        _clicks++;

        if (_clicks > 5)
        {
            _service.InitCancelActivity();
        }
    }
}


[Service(Name = "com.ff.GeneralService")]
public class GeneralService : Service {
    private readonly Android.Media.MediaPlayer _player;

    public GeneralService()
    {
        _player = new Android.Media.MediaPlayer(); 
    }

    public void RaiseAlert()
    {
        // start playing .mp3 file
    }

    public void KillAlert(string pass)
    {
        // stop playing .mp3 file
    }

    public void InitCancelActivity()
    {
        this.RaiseAlert();

        var i = new Intent(this, typeof(CancelActivity));
        i.SetFlags(ActivityFlags.NewTask);
        this.StartActivity(i);
    }
}

[Activity(Label = "CancelActivity")]
public class CancelActivity : Activity
{
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        SetContentView(Resource.Layout.cancel);

        this.FindViewById(Resource.Id.cancelButtonYes).Click += delegate
        {
            var password = this.FindViewById(Resource.Id.cancelPassword);

            // call KillAlert method from GeneralServic
        };
    }
}

1 个答案:

答案 0 :(得分:0)

创建静态GeneralService实例并在Cancel Activity中使用。 例如

[Service(Name = "com.ff.GeneralService")]
public class GeneralService : Service {
    private readonly Android.Media.MediaPlayer _player;
    public static generalService;
    public GeneralService()
    {
        _player = new Android.Media.MediaPlayer(); 
         generalService=this
    }

    public void RaiseAlert()
    {
        // start playing .mp3 file
    }

    public void KillAlert(string pass)
    {
        // stop playing .mp3 file
    }

    public void InitCancelActivity()
    {
        this.RaiseAlert();

        var i = new Intent(this, typeof(CancelActivity));
        i.SetFlags(ActivityFlags.NewTask);
        this.StartActivity(i);
    }
}

并在CancelActivity中使用,例如下面的例子

[Activity(Label = "CancelActivity")]
public class CancelActivity : Activity
{
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        SetContentView(Resource.Layout.cancel);

        this.FindViewById(Resource.Id.cancelButtonYes).Click += delegate
        {
            var password = this.FindViewById(Resource.Id.cancelPassword);

            // call KillAlert method from GeneralServic
          GeneralService.generalService.KillAlert(password.TEXT);

        };
    }
}