如何从广播接收器类调用颤振方法?

Posted

技术标签:

【中文标题】如何从广播接收器类调用颤振方法?【英文标题】:How to invoke flutter method from broadcastReceiver class? 【发布时间】:2021-01-08 15:43:09 【问题描述】:

我正在尝试在接到电话时唤醒颤振方法。我已经完成了接收部分,但是我还不能唤醒颤振方法。

我尝试在 MainActivity.kt 类的 onReceive() 方法中调用方法通道,但它给了我错误。方法通道似乎只在 onCreate() 方法中起作用。

问题是如何在 onReceive() 中调用颤振方法,或者有其他方法吗?

MainActivity.kt

import android.Manifest
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.content.pm.PackageManager
import android.os.Build
import android.os.Bundle
import android.widget.Toast
import androidx.annotation.RequiresApi
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import io.flutter.app.FlutterActivity
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugins.GeneratedPluginRegistrant


class MainActivity: FlutterActivity()


    var updateUIReciver: BroadcastReceiver? = null

    @RequiresApi(Build.VERSION_CODES.O)
    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        GeneratedPluginRegistrant.registerWith(this)
        registerReceiver(broadcastReceiver,  IntentFilter("Service.to.activity"));

        val channel = "my.data"
        val methodChannel = MethodChannel(flutterView, channel)
        val map: HashMap<String, String> = HashMap()


        val permissionCheck: Int = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)
        if (permissionCheck == PackageManager.PERMISSION_GRANTED) 
            Toast.makeText(this, "Permission granted ", Toast.LENGTH_LONG).show();

         else 
            //TODO
            ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.READ_PHONE_STATE), 4);
            Toast.makeText(this, "Permission not granted ", Toast.LENGTH_LONG).show();
        

        methodChannel.setMethodCallHandler  call: MethodCall, result: MethodChannel.Result? ->
            if (call.method == "callMyFunction") 
                methodChannel.invokeMethod("callMyFunction", map)

             else 

            
        
    

    var broadcastReceiver: BroadcastReceiver = object : BroadcastReceiver() 

        override fun onReceive(context: Context, intent: Intent) 

            Toast.makeText(context, "Incoming call received", Toast.LENGTH_LONG).show()
// I can't call "methodChannel.invokeMethod("callMyFunction", map)" here cause of error.
        
    

MyBroadcastReceiver.kt

import android.app.Service
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.telephony.PhoneStateListener
import android.telephony.TelephonyManager
import androidx.core.app.NotificationCompat
import android.app.NotificationManager;
import android.os.Build;
import android.os.IBinder;
import android.widget.Toast

class MyBroadcastReceiver : BroadcastReceiver() 

    override fun onReceive(context: Context, intent: Intent) 


        val telephony = context.getSystemService(Service.TELEPHONY_SERVICE) as TelephonyManager
        telephony.listen(object : PhoneStateListener() 
            override fun onCallStateChanged(state: Int, incomingNumber: String) 
                super.onCallStateChanged(state, incomingNumber)
                
                context.sendBroadcast(Intent("Service.to.activity"))


            
        , PhoneStateListener.LISTEN_CALL_STATE)
    

颤振代码

 const platform = const MethodChannel('my.data');

  Future<void> _receiveFromNative(MethodCall call) async 
    try 
      if (call.method == "callMyFunction") 

        print("Received in flutter");
      
     on PlatformException catch (e) 
  

  platform.setMethodCallHandler(_receiveFromNative);

【问题讨论】:

【参考方案1】:

基本上你不能直接访问 BroadcastReceiver 中的 methodChannel 所以你必须在 compaion 对象中创建 methodChannel 所以,

将这些行添加到您的 MainActivity

companion object 
    lateinit var methodChannel: MethodChannel

并在 MainActivity 的 onCreate 方法中替换

val methodChannel = MethodChannel(flutterView, channel)

收件人:

methodChannel = MethodChannel(flutterView, channel)

现在您可以在应用中的任何位置使用 MainActivity.methodChannel。

【讨论】:

以上是关于如何从广播接收器类调用颤振方法?的主要内容,如果未能解决你的问题,请参考以下文章

Android广播阻塞、延迟问题

从广播接收器在 AlarmManager 事件上启动 Activity

如何将结果数据从广播接收器发送到活动

在广播接收器中调用活动字符串方法[重复]

从广播接收器获取唤醒锁的问题

广播接收器类可以进行休息客户端调用吗?