【问题标题】:How to call same service instance from multiple activities in Android如何从 Android 中的多个活动中调用相同的服务实例
【发布时间】:2017-05-05 21:50:52
【问题描述】:

我刚刚开始研究 Xamarin,只是想不通如何让多个活动具有引用相同的服务实例。

我从MainActivity 开始KeyPressedReceiver 并开始监听电源按钮被按下。

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

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

问题是如何从CancelActivity 引用GeneralService 的实例(已经创建),所以我可以调用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
        };
    }
}

【问题讨论】:

    标签: c# android xamarin xamarin.android


    【解决方案1】:

    创建静态 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);
    
            };
        }
    }
    

    【讨论】:

    • 这就是我现在所拥有的,但由于某种原因,它似乎确实是错误的。但也许只有我
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多