BroadcastReceiver死于app

时间:2017-01-15 15:27:33

标签: android android-service android-broadcastreceiver

如果我让手机长时间静坐15分钟,我就失去了我的接收器,但我认为这是因为内存被杀后会像服务一样坚持。

清单:

<receiver
    android:name=".WearableReceiver"
    android:enabled="false">
    <intent-filter>
        <action android:name="com.example.johnbravado.MESSAGE_PROCESSED"/>
    </intent-filter>
</receiver>

在活动中启动接收器

ComponentName component = new ComponentName(CounterActivity.this, WearableReceiver.class);
getPackageManager()
    .setComponentEnabledSetting(component,
        PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
        PackageManager.DONT_KILL_APP);

接收者

@Override
public void onReceive(Context context, Intent intent) {
    // TODO: This method is called when the BroadcastReceiver is receiving
    // an Intent broadcast.
    //MyConstants.getInstance().showToast("Message Rcvd");
    PowerManager powerManager = (PowerManager) context.getSystemService(POWER_SERVICE);
    PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
            "com.example.johnbravado");
    wakeLock.acquire();
    // Do Work
    MyConstants.getInstance().msgReqAction(intent.getIntExtra(MyConstants.BROADCAST_DATA_REQ, 0));

    wakeLock.release();
}

广播发件人

String BROADCAST_ACTION_RESP = "com.example.johnbravado.MESSAGE_PROCESSED"
@Override
public void onMessageReceived(final MessageEvent messageEvent) {
    nodeId = messageEvent.getSourceNodeId();
    String incomingPath = messageEvent.getPath();
    int incomingReq = Integer.parseInt(new String(messageEvent.getData()));

    if(incomingPath.equalsIgnoreCase(MyConstants.MSG_COUNTER_REQ_PATH)) {
        Intent broadcastIntent = new Intent();
        broadcastIntent.setAction(BROADCAST_ACTION_RESP);
        broadcastIntent.putExtra(MyConstants.BROADCAST_DATA_REQ, incomingReq);
        sendBroadcast(broadcastIntent);

    }else if(incomingPath.equalsIgnoreCase(MyConstants.MSG_DEFAULT_PATH)){

    }
}
只有这样才能让它持续很长一段时间才能调用服务

wearableReceiverIntent = new Intent(this, WearableReceiverService.class);
if(!WearableReceiverService.isRunning())
    startService(wearableReceiverIntent);

服务

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    // Let it continue running until it is stopped.
    IntentFilter filter = new IntentFilter(MyConstants.BROADCAST_ACTION_RESP);
    filter.addCategory(Intent.CATEGORY_DEFAULT);
    receiver = new WearableReceiver();
    registerReceiver(receiver, filter);

Notification notification = new NotificationCompat.Builder(this)
        .setSmallIcon(R.drawable.ic_notif_bible)
        .setContentText("Preaching").build();
startForeground(MyConstants.NOTIF_COUNTING_SERVICE, notification);

    isRunning = true;
    return START_STICKY;
}

如果我运行该服务,它会持续很长一段时间,但考虑到我每10分钟只进行一次交互,它会不必要地耗尽电池。我受到了印象广播接收器将像服务一样工作,除了短时间的工作。如果您需要做长时间的操作,请调用该服务。

5 个答案:

答案 0 :(得分:1)

当屏幕关闭时,Greenify正在查杀我的应用程序。我正在与一些我没有希望用代码进行防御的东西作斗争。在我明确告诉Greenify不要杀死我的应用程序之后,我从来没有告诉它开始杀死我的应用程序,一切都按预期工作。

答案 1 :(得分:1)

由于华硕移动管理器应用程序,我的华硕ZenPad 出现了同样的问题,特别是“自动启动管理器”阻止了我的应用程序的意图。

停用应用程序(无法卸载)不值得,解决方案一直是安装应用程序但将我的开发应用程序列入白名单,以便它可以像PACKAGE_REPLACE一样接收广播。 (注意开关是混乱的,你实际上必须触摸“阻塞”,所以它打开“允许”启用它。

我认为另一个选择是更新或更改ROM(选择一个没有所有的英国媒体报道)。

答案 2 :(得分:0)

BroadcastReceiver处理意图然后再次停止。这种对意图的处理应该很快。如果你想做很多事情,你应该从Service开始BroadcastReceiver并从那里处理它。

  

BroadcastReceiver对象仅在通话期间有效   to onReceive(Context,Intent)。一旦你的代码从此返回   功能,系统认为要完成的对象不再   活性

使用sendBroadcast意图启动BroadcastReceiver。 因此,请移除android:enabled="false"并使用sendBroadcast,这将启动Android的Receiver。

http://www.vogella.com/tutorials/AndroidBroadcastReceiver/article.html

答案 3 :(得分:0)

如果您的清单中设置了BroadcastReceiver,则无需尝试调整包的PackageManager组件信息。只要您删除enabled="false"部分。

您的BroadcastReceiver应该做的非常简短:通常会更新一些内部数据或启动另一个可以解决您的应用操作繁重问题的组件。您可以使用它来触发Service在后​​台执行此类操作。但是,请注意&#34;背景&#34;在这种情况下意味着没有用户交互。它并不意味着执行的后台上下文,例如辅助线程。您需要管理Service中的主题。您的BroadcastReceiverService回调入口点(onReceive()onStartIntent())会在您应用的主线程的上下文中运行。

电源管理肯定会在所有这些方面发挥作用。您的广播Intent实际上是以唤醒设备的方式发送和完成的吗?如果它确实唤醒了设备并发送了Intent,则设备只会保持清醒足够长时间以使BroadcastReceiver运行其onReceive();在那之后返回没有保证。该设备将积极地睡觉,这就是唤醒锁是一件事。但是,除非正确使用,否则使用唤醒锁会导致电池耗尽过多。如果您在Marshmallow或更新版本上运行,Doze功能也会破坏您的计划。在打盹模式下忽略唤醒锁,并且在用户将设备退出打瞌睡之前不会被考虑。

答案 4 :(得分:-1)

我遇到了同样的问题,并通过授予该应用的自动启动权限来解决此问题。

转到 设置 - &gt;权限 - &gt;管理自动启动 并允许自动启动您的应用。