标签: android-broadcast

用Greenrobot Eventbus替换广播接收器以触发基于事件的功能和从服务到活动的数据传输是否有用?

我已经实现了一个服务,我处理状态更改(连接,断开连接,onServiceDiscoverd,onCharacteristicChange等)并通过gatt服务器从另一个设备接收数据.

我的问题是,使用Greenrobot Eventbus 在服务和活动之间替换广播接收器可以有效地处理事件吗?

android android-service bluetooth-lowenergy android-broadcast greenrobot-eventbus

17
推荐指数
1
解决办法
6164
查看次数

Android 14 上下文注册的广播接收器不起作用

我正在 Android 14 设备上试验我的应用程序,我发送本地广播,然后在应用程序内订阅它。但是,当我使用该RECEIVER_NOT_EXPORTED选项时,根本没有收到广播。

下面是我正在使用的代码:

class DashboardFragment : Fragment() {
private var \_binding: FragmentDashboardBinding? = null

    // This property is only valid between onCreateView and
    // onDestroyView.
    private val binding get() = _binding!!
    
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        val dashboardViewModel =
            ViewModelProvider(this).get(DashboardViewModel::class.java)
    
        _binding = FragmentDashboardBinding.inflate(inflater, container, false)
        val root: View = binding.root
    
        binding.button.setOnClickListener {
            Intent("com.nama.action").also { intent ->
                intent.putExtra("nama", dashboardViewModel.text.value)
                requireContext().sendBroadcast(intent)
            }
        }
    
        val textView: TextView = binding.textDashboard
        dashboardViewModel.text.observe(viewLifecycleOwner) {
            textView.text …
Run Code Online (Sandbox Code Playgroud)

android broadcastreceiver android-broadcast android-14

17
推荐指数
1
解决办法
3626
查看次数

你可以使用localbroadcasts的待定意图吗?

我有兴趣使用与本地广播挂起的意图.为了使自己清楚,我使用以下内容来注册接收器和发送广播:android.support.v4.content.LocalBroadcastManager.

我在服务中有一个本地广播接收器.我正在尝试从包含可点击项目的自定义通知布局发送本地广播.

本地广播接收器 - 只接收简单的动作意图.我尝试这样的事情无济于事:

Intent backintent = new Intent("GOTO_START_BROADCAST");
PendingIntent backIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, backintent, 0);
RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.custom_notification);
contentView.setOnClickPendingIntent(R.id.imageView1, backIntent);
Run Code Online (Sandbox Code Playgroud)

android android-pendingintent android-broadcast

15
推荐指数
1
解决办法
3060
查看次数

Broadcast Receiver class and registerReceiver method

嗨,我想了解广播接收器,我经历了许多示例代码,但仍有一些疑问.我想知道什么时候我们必须扩展Broadcast Receiver类,什么时候应该使用registerReceiver()方法,什么时候应该为BroadcastReceiver创建对象.在某些程序中,我遇到了registerReceiver正在使用的方法,但没有扩展Broadcast Receiver类.我也想知道如何onReceive调用该方法.

应该采用哪种方法?

这是registerReceiver方法:

registerReceiver(new BroadcastReceiver() {

            @Override
            public void onReceive(Context context, Intent intent) {
                switch (getResultCode()) {
                ........
                }

            }

        }, new IntentFilter(SENT));
Run Code Online (Sandbox Code Playgroud)

正在创建的对象BroadcastReceiver:

private BroadcastReceiver intentReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
        .................
    }

};
Run Code Online (Sandbox Code Playgroud)

android android-broadcast

15
推荐指数
1
解决办法
7万
查看次数

java.lang.SecurityException:Permission Denial:不允许仅在KitKat上发送广播android.intent.action.MEDIA_MOUNTED

我正在使用DownloadManager从我们的服务器下载图像,我将文件放在externalFilesDir.

我发送广播意图因为我不希望这些下载的图像出现在图库中.

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + context.getExternalFilesDir(null))));
Run Code Online (Sandbox Code Playgroud)

我之前只在我的Galaxy S3 Jelly Bean 4.3上测试了它并且它正在工作,但是当我测试它时KitKat 4.4它崩溃了应用程序.

有没有更好的方法可以不从DownloadManager下载的文件没有出现在电话库中?

堆栈跟踪

06-05 17:34:41.940: E/AndroidRuntime(15410): FATAL EXCEPTION: main
06-05 17:34:41.940: E/AndroidRuntime(15410): Process: com.walintukai.lfdate, PID: 15410
06-05 17:34:41.940: E/AndroidRuntime(15410): java.lang.RuntimeException: Error receiving broadcast Intent { act=android.intent.action.DOWNLOAD_COMPLETE flg=0x10 pkg=com.walintukai.lfdate (has extras) } in com.walintukai.lfdate.SocketIOService$1@42359f40
06-05 17:34:41.940: E/AndroidRuntime(15410):    at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:778)
06-05 17:34:41.940: E/AndroidRuntime(15410):    at android.os.Handler.handleCallback(Handler.java:733)
06-05 17:34:41.940: E/AndroidRuntime(15410):    at android.os.Handler.dispatchMessage(Handler.java:95)
06-05 17:34:41.940: E/AndroidRuntime(15410):    at android.os.Looper.loop(Looper.java:136)
06-05 17:34:41.940: E/AndroidRuntime(15410):    at android.app.ActivityThread.main(ActivityThread.java:5057)
06-05 17:34:41.940: E/AndroidRuntime(15410):    at …
Run Code Online (Sandbox Code Playgroud)

android broadcastreceiver android-intent android-broadcast

15
推荐指数
2
解决办法
4万
查看次数

Android - 尝试在启动时测试服务(java.lang.SecurityException:Permission Denial)

当设备在Android上启动时,我一直在尝试测试服务,但我无法让它工作.我正试图用CMD的这个命令启动它:

(在..\AppData\Local\Android\sdk\platform-tools中)

adb shell am broadcast -a android.intent.action.BOOT_COMPLETED
Run Code Online (Sandbox Code Playgroud)

要么

adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -c android.intent.category.HOME -n net.fstab.checkit_android/.MyReceiver
Run Code Online (Sandbox Code Playgroud)

AndroidManifest.xml中

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.tabache.sciopero">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>


    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

    <application
        android:name="com.example.tabache.sciopero.MyApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <!-- Declaring broadcast receiver for BOOT_COMPLETED event.  PER FARE UN SERVIZIO AVVIATO ALL'INIZIO -->
        <receiver android:name="com.example.tabache.sciopero.MyReceiver" android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>

        <activity …
Run Code Online (Sandbox Code Playgroud)

boot android adb broadcastreceiver android-broadcast

15
推荐指数
2
解决办法
8266
查看次数

Android广播接收器没有收到意图

我有两个应用程序,我试图将一个意图从一个发送到另一个,但意图是永远不会到达,onReceive()但这个问题只是一种方式.第一个应用程序可以发送到第二个,但第二个不能发回信息.我使用不同的意图动作从第二个发送到第一个,但否则它们是相同的.为什么这可能不起作用的任何想法?我已经尝试了我能想到的所有内容,并阅读了我在这里找到的大部分帖子,但无济于事.

它没有崩溃,也没有给我任何迹象表明logcat中发生了什么,它什么也没做.

发送功能

private void sendFinishLog(String ID, String Cond)
{
    Log.d("me", "send finish log");
    Intent logIntent = new Intent();
    logIntent.putExtra("ID", ID);
    logIntent.putExtra("Cond", Cond);
    logIntent.setAction("com.me.intent.finishlog");
    Log.d("me","logIntent : " + logIntent.toString()   
        +logIntent.getExtras().toString());
    sendBroadcast(logIntent);
}
Run Code Online (Sandbox Code Playgroud)

接受上课

public class LogReceiver extends BroadcastReceiver {

    public static ArrayList<LogDataHolder> logData = new ArrayList<LogDataHolder>();
    private boolean found;
    static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    private static String lasttime;
    private static String now = "Boot time";
    @Override
    public void onReceive(Context cont, Intent logIntent) 
    {
        Log.d("me","On receive");
                etc..... …
Run Code Online (Sandbox Code Playgroud)

android intentfilter android-intent android-broadcast

14
推荐指数
2
解决办法
3万
查看次数

Android ACTION_DATE_CHANGED广播

我有一个Nexus S,当我在手机上手动更改日期时,并不总是广播ACTION_DATE_CHANGED.如果我将日期从2014年2月13日更改为2014年2月14日,我还没有获得ACTION_DATE_CHANGED工作,但如果我将其设置为未来几年,我有时会将其解雇.

我可以(99%)向你保证我不会滥用IntentFilters,BroadcastReceivers等.我只是好奇为什么这个广播记录得如此糟糕.通过SO和Google进行的快速扫描显示,当用户手动更改,或者日期在每天凌晨12:00或两者都滚动时,人们不确定是否会发生这种情况.我的经验表明,它与用户更改非常不一致,我没有尝试过系统更改.

我将通过AOSP代码,并隔离所有被触发的点并报告回来.

编辑:问题:任何人都知道这里发生了什么?:-)

android broadcastreceiver android-intent android-broadcast

14
推荐指数
1
解决办法
1万
查看次数

带有广播接收器和隐式广播禁令的Android 8.0 Oreo AlarmManager

我有通过报警管理器设置的关键提醒(它的功能与闹钟应用程序相同).

以前我的Android Manifest中有以下内容:

    <receiver android:name="com.example.app.AlarmReceiver" >
        <intent-filter>
            <action android:name="${packageName}.alarm.action.trigger"/>
        </intent-filter>
    </receiver>
Run Code Online (Sandbox Code Playgroud)

广播接收器:

public class AlarmReceiver extends BroadcastReceiver {

  @Override public void onReceive(
      final Context context,
      final Intent intent) {
// WAKE LOCK
// BUILD NOTIFICATION etc...
  }

}
Run Code Online (Sandbox Code Playgroud)

如何设置警报:

final PendingIntent operation = PendingIntent.getBroadcast(
          mContext,
          requestCode,
          intent,
          PendingIntent.FLAG_CANCEL_CURRENT);

      if (PlatformUtils.hasMarshmallow()) {
        alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, triggerAtMillis, operation);

      } else {
        alarmManager.setExact(AlarmManager.RTC_WAKEUP, triggerAtMillis, operation);
      }
}
Run Code Online (Sandbox Code Playgroud)

使用Android 8.0,我不能再使用Manifest中定义的隐式广播.那很好,给出的替代方法是手动注册它,如下所示:

final BroadcastReceiver receiver = new AlarmReceiver();
final IntentFilter intentFilter = new IntentFilter(ALARM_RECEIVER_INTENT_TRIGGER);
context.registerReceiver(receiver, intentFilter);
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎不合逻辑.

  1. 警报接收器将与上下文的生命周期相关联.当由于内存压力或设备重启而导致应用程序被杀死时,这会导致问题.我每次都需要触发警报,因为它们对用户的健康至关重要. …

android broadcastreceiver android-broadcast

14
推荐指数
1
解决办法
1万
查看次数

Android:是非导出的广播接收器吗?

如果我在这样的活动中注册广播接收器,

@Override
protected void onResume() {
    super.onResume();

    myReceiver = new BroadcastReceiver() { ... };
    IntentFilter filter = new IntentFilter("com.example.MY_ACTION");
    registerReceiver(myReceiver, filter);
}
Run Code Online (Sandbox Code Playgroud)

这个接收器是出口的?如果另一个应用程序广播com.example.MY_ACTION,是否会收到myReceiver

如果是,我假设我需要使用registerReceiver()接受字符串权限的形式,然后在我的清单中定义该权限,为其提供高保护级别(例如签名).那是对的吗?有更简单的方法吗?

谢谢.

android broadcastreceiver android-broadcast

13
推荐指数
1
解决办法
2667
查看次数