微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

广播接收器未通过Xamarin Android中的OnReceive方法显示Toast

如何解决广播接收器未通过Xamarin Android中的OnReceive方法显示Toast

在尝试在我的项目中实现broadcast接收器类时,我有一个扩展了broadcastReceiver类的接收器,我打算检查是否通过单击按钮接收到broadcast,OnReceive方法内部有一个Toast代码,该代码显示如果广播成功发送,请保持"{{ item.key }}"。我的代码看起来像这样...

Intent Detected

我的Manifest.xml文件的接收方代码部分如下所示

 class FlashActivity : AppCompatActivity
    {
           protected override void OnCreate(Bundle savedInstanceState)
           {
         //Button deFinition
            Button button1 = this.FindViewById<Button>(Resource.Id.button1);
        //Clicking on this button should send the broadcast message
            button1.Click += broadCastIntent;
           }
      //Method to send broadcast message on button click
       private void broadCastIntent(object sender,EventArgs e)
        {
            Intent intent = new Intent();
            intent.SetAction("com.Java_Tutorial.CUSTOM_INTENT");
            Sendbroadcast(intent);
        }
       //broadCast Receiver class Implementation

       [broadcastReceiver(Name="com.Java_Tutorial.CUSTOM_INTENT")]
        public class MyReceiver: broadcastReceiver
        {
            public override void OnReceive(Context context,Intent intent)
            {
           //AckNowledge message was received via a Toast
                Toast.MakeText(context,"Intent Detected.",ToastLength.Long).Show();
            }
        }
    }

当我单击按钮时,没有显示Toast,请帮助...

解决方法

您需要添加一个IntentFilter属性

[BroadcastReceiver(Enabled = true)]
[IntentFilter(new[] { "com.Java_Tutorial.CUSTOM_INTENT" })]
public class MyReceiver: BroadcastReceiver
{
    public override void OnReceive(Context context,Intent intent)
     {
         //Acknowledge message was received via a Toast
         Toast.MakeText(context,"Intent Detected.",ToastLength.Long).Show();
     }
}
,

当我单击按钮时,没有显示吐司

您没有在活动中注册BroadcastReceiver

请按照以下代码进行注册。

  [Activity(Label = "@string/app_name",Theme = "@style/AppTheme",MainLauncher = true)]
    public class MainActivity : AppCompatActivity
    {
        MyReceiver receiver;
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            Xamarin.Essentials.Platform.Init(this,savedInstanceState);
            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.activity_main);
            Button button1 = this.FindViewById<Button>(Resource.Id.button1);

             receiver = new  MyReceiver();
            //Clicking on this button should send the Broadcast message
            button1.Click += broadCastIntent; ;
          
        }

      

        private void broadCastIntent(object sender,System.EventArgs e)
        {
            Intent intent = new Intent();
            intent.SetAction("com.Java_Tutorial.CUSTOM_INTENT");
            SendBroadcast(intent);

           
        }
        //BroadCast Receiver class Implementation
        protected override void OnResume()
        {
            base.OnResume();
            RegisterReceiver(receiver,new IntentFilter("com.Java_Tutorial.CUSTOM_INTENT"));
            // Code omitted for clarity
        }

        protected override void OnPause()
        {
            UnregisterReceiver(receiver);
            // Code omitted for clarity
            base.OnPause();
        }

        public override void OnRequestPermissionsResult(int requestCode,string[] permissions,[GeneratedEnum] Android.Content.PM.Permission[] grantResults)
        {
            Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode,permissions,grantResults);

            base.OnRequestPermissionsResult(requestCode,grantResults);
        }
    }

    
    [BroadcastReceiver(Name = "com.Java_Tutorial.CUSTOM_INTENT")]
    public class MyReceiver : BroadcastReceiver
    {
        public override void OnReceive(Context context,Intent intent)
        {
            //Acknowledge message was received via a Toast
            Toast.MakeText(context,ToastLength.Long).Show();
        }
    }
}

此处正在运行GIF。

enter image description here

这是有关广播的有用文章。您可以参考它。

https://docs.microsoft.com/en-us/xamarin/android/app-fundamentals/broadcast-receivers#context-registering-a-broadcast-receiver

更新

试图找到一个帖子,在其中您可以通过广播检测手电筒是否已经打开,然后相应地在我的应用中切换开关

Android OS不为手电筒提供系统广播。但是我们可以检查手电筒的状态。如果手电筒的状态为打开,则可以发送广播,然后我们的broadcastReceiver可以获取它。

// note: camera come from:  private Android.Hardware.Camera camera=Android.Hardware.Camera.Open();

 if (camera.GetParameters().FlashMode.Equals(Android.Hardware.Camera.Parameters.FlashModeOff))
            {
                switchOn = false;
            }
            else if (camera.GetParameters().FlashMode.Equals(Android.Hardware.Camera.Parameters.FlashModeTorch))
            {
                switchOn = true;
                Intent intent = new Intent();
                intent.SetAction("com.Java_Tutorial.CUSTOM_INTENT");
                SendBroadcast(intent);
            }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。