当前位置: 首页 > 知识库问答 >
问题:

正在使用指定意图发送服务中的广播

包兴思
2023-03-14

我正在尝试发送广播,但onreceive()从未被调用。

该服务打印以下Toast消息(when Bluetooth state is Change)-

“已创建服务”

这对于filter1很好,但是对于filter2:

该服务仅打印以下Toast消息(when Bluetooth state未更改)-

“已创建服务”

public class DataProcessService  extends Service {
    public IBinder onBind(Intent intent)
    {
        return null;
    }

    @Override
    public void onCreate() 
    {               
        Toast.makeText(this, "Service created", Toast.LENGTH_LONG).show();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) 
    {
        Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();

        IntentFilter filter1, filter2;

        filter1 = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);

        if ((intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, -1) == BluetoothAdapter.STATE_ON) 
             && !getSetting("STATUS", "").equals("Connected") && 
             !Common.isAppInForeground(getApplicationContext())) 
        {
            filter2 = new IntentFilter("true");
        }
        else
            filter2 = new IntentFilter("false");

        this.registerReceiver(mReceiver, filter1);
        this.registerReceiver(mReceiver, filter2);

        sendBroadcast(intent);

        return START_STICKY;
    }

    //The BroadcastReceiver that listens for bluetooth broadcasts
    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            //String action = intent.getAction();
            //BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            Toast.makeText(DataProcessService.this, "BT change received !", Toast.LENGTH_LONG).show();

            if(intent.getAction().equals("true"))
            {
                Toast.makeText(DataProcessService.this, "Service in Background", Toast.LENGTH_LONG).show();
            }

            if(intent.getAction().equals("false"))
            {
                Toast.makeText(DataProcessService.this, "Service in foreground", Toast.LENGTH_LONG).show();
            }

            if ((intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, -1) == BluetoothAdapter.STATE_OFF) || 
                  !getSetting("STATUS", "").equals("Connected") || Common.isAppInForeground(getApplicationContext())) {

                Toast.makeText(DataProcessService.this, "Service Self Stop", Toast.LENGTH_LONG).show();
                stopSelf();
            }
            else
            {
                Toast.makeText(DataProcessService.this, "Service Continues", Toast.LENGTH_LONG).show();
            }
        }
    };

    @Override
    public void onDestroy() 
    {
        this.unregisterReceiver(mReceiver);
        Toast.makeText(this, "Background work Stopped", Toast.LENGTH_LONG).show();
    }

    public String getSetting(String key, String def) {
        SharedPreferences settings;

        try
        {
            settings = getSharedPreferences("IDDLPref", 0);

            return settings.getString(key, def);
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

        return "";
    }
}

共有1个答案

姜煌
2023-03-14

这是因为filter2根据其值为动作“true”或“false”注册。当Bluetooth状态因filter1而改变时,它可以工作,而当它不改变时,它根本不工作,因为filter2被注册到未发生的事情上。如果你想让它在没有蓝牙改变的情况下工作,你需要广播:

sendBroadcast(new Intent("true"))  // or "false" instead of "true", depending on the IntentFilter's value, or both if you want to make sure it will be called.
 类似资料:
  • 我正在开发https://github.com/mauron85/cordova-plugin-mauron85-background-geolocation-phoneGapbuild 基本上,这是一个cordova插件,它使用LocationManager向WebView发送位置。 服务也有自己的进程(android:process=“:remote”)。因此,服务将服务主要活动(线程)杀死或

  • 我的应用程序通过使用“系统警报”对话框的服务创建聊天头。现在,我在这个对话框中有一些图像,我想用一个intent来分享它们。 但是我得到的错误是: android.util.AndroidRuntimeExcture:从活动上下文外部调用starActive()需要FLAG_ACTIVITY_NEW_TASK标志。这真的是你想要的吗? 如何解决这个问题? Im用于共享图像的代码是:

  • 据我所知,Toast通知不仅适用于Windows10,而且适用于Windows8。这适用于制作服务吗?我要做的事情可能吗? 目前,我打算制作一个单独的应用程序,它只是为了发送一个通知而被调用,但这似乎是矫枉过正。

  • 我要做的是在Dropzone之前。js将删除的图像发送到服务器,会出现一个带有裁剪器的模式。js(fengyuanchen脚本),用户可以裁剪图像,当图像被裁剪时,用Dropzone发送。js连接到服务器。 因此,当我用函数fileToBase64更改#cropbox的图像src,并用函数croper('replace')替换裁剪器的图像时,它会一直显示默认值。jpg图片,而不是用户上传的新图片

  • 我写的Alexa技能有以下设置: 意图架构 样本话语 当Alexa听到: alexa让我的应用程序清除我的购物清单 正如预期的那样,发送了正确的ClearGrocerieContent。然而,当Alexa听说: alexa让我的应用程序清除购物清单 改为发送GetGrocerieContent。 这个问题不能被服务模拟器复制,它可以正常工作。只有在演讲时,它才会变得混乱,尽管(根据历史)Alexa

  • 我正在尝试使用不同的应用程序附加图像,代码如下: 附加的图像是使用以下代码生成的: 但当我试图打开GMAIL与此意图,只有文本显示应用程序与错误:. 我错过了什么? 编辑 这是另一个解决方案:android。操作系统。FileUrieExposedException:文件。jpg通过ClipData曝光了app之外的内容。项目getUri()