【问题标题】:Broadcast Receiver not displaying Toast via OnReceive method in Xamarin Android广播接收器未通过 Xamarin Android 中的 OnReceive 方法显示 Toast
【发布时间】:2020-10-13 19:06:45
【问题描述】:

我正在尝试在我的项目中实现广播接收器类,我有一个扩展类 BroadcastReceiver 的接收器,我打算检查是否通过单击按钮接收到广播,OnReceive 方法内部有一个 Toast 代码,应该显示nessage Intent Detected 如果广播成功发送。我的代码看起来像这样...

 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();
            }
        }
    }

我的 Manifest.xml 文件的 Receiver 代码部分如下所示

<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme">
        <receiver android:name="MyReceiver">
            <intent-filter>
                <action android:name="com.Java_Tutorial.CUSTOM_INTENT"></action>
            </intent-filter>
        </receiver>
    </application>

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

【问题讨论】:

    标签: android xamarin button broadcast


    【解决方案1】:

    当我点击按钮时,不显示 Toast

    您没有在 Activity 中注册您的 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, permissions, 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, "Intent Detected.", ToastLength.Long).Show();
            }
        }
    }
    

    这里正在运行 GIF。

    这是一篇关于广播的有用文章。你可以参考它。

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

    更新

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

    Android OS 不提供手电筒的系统广播。但是我们可以查看手电筒的状态。如果手电筒的状态是open,我们可以发送一个广播,然后我们的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);
                }
    

    【讨论】:

    • 感谢您澄清接收器注册,您能否在下面发布代码我如何接收手电筒打开的广播消息
    • 我真的试图找到一个帖子,你可以通过广播检测手电筒是否已经打开,然后在我的应用程序中相应地切换开关,但我没有,你能发布代码我如何检测手电筒打开留言
    【解决方案2】:

    你需要添加一个 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();
         }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-09-19
      • 1970-01-01
      • 1970-01-01
      • 2016-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-06
      • 1970-01-01
      相关资源
      最近更新 更多