【问题标题】:Keep connectivity broadcast receiver running after application is closed在应用程序关闭后保持连接广播接收器运行
【发布时间】:2016-05-13 03:50:28
【问题描述】:

当我需要使用 Internet 连接并且无法连接时,我想设置一个广播接收器,该接收器在应用关闭时继续工作。

我为此使用了一项服务,但它不起作用。当应用程序在屏幕上或暂停时它工作正常,但如果我关闭它就会停止工作。我不太确定是否应该使用其他东西或者我做错了什么。

这是我的代码:

package com.example.ana.exampleapp;

import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.os.IBinder;
import android.util.Log;

public class TestsService extends Service {

    private static BroadcastReceiver networkChangeReceiver;
    private static String TAG = "Service";

    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }

    @Override
    public void onCreate() {
        Log.v(TAG, "Service created");
        boolean keep = needTokeepWaiting()
        if(!keep)
            stopSelf();
    }

    @Override
    public void onDestroy() {
        if (networkChangeReceiver != null)
            unregisterReceiver(networkChangeReceiver);
        networkChangeReceiver = null;
        Log.v(TAG, "Service destroyed");
    }

    private void registerNetworkChangeReceiver() {
        networkChangeReceiver = new BroadcastReceiver() {
            private String TAG = "NetworkReceiver";

            @Override
            public void onReceive(Context context, Intent intent) {
                Log.v(TAG, "Connection changed received");
                            boolean keep = needTokeepWaiting()
                if(!keep)
                    stopSelf();
            }
        };
        IntentFilter filter = new IntentFilter(android.net.ConnectivityManager.CONNECTIVITY_ACTION);
        registerReceiver(networkChangeReceiver, filter);
    }
}

还有我的清单:

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:windowSoftInputMode="stateHidden">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".RegisterActivity"></activity>
        <activity android:name=".FinishRegisterActivity"></activity>
        <activity android:name=".TestActivity"></activity>
        <activity android:name=".InformationActivity"></activity>
        <service android:name=".TestsService"></service>
    </application>

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

必要时在 TestActivity 中执行:

Intent service = new Intent(this, TestsService.class);
startService(service);

我正在做的与这里建议的类似,但它不起作用:

Keep broadcast receiver running after application is closed

我也尝试过不使用服务并在清单中注册,但它也没有工作:

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity"
            android:windowSoftInputMode="stateHidden">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".RegisterActivity">
        </activity>
        <activity android:name=".FinishRegisterActivity" >
        </activity>
        <activity android:name=".TestActivity">
        </activity>
        <activity android:name=".InformationActivity" >
        </activity>
        <receiver android:name=".NetworkChangeReceiver"
            android:enabled="false">
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
            </intent-filter>
        </receiver>
    </application>
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
</manifest>

【问题讨论】:

  • 该广播不需要持续运行的Service。您可以在清单中为 "android.net.conn.CONNECTIVITY_CHANGE" &lt;action&gt; 注册一个 &lt;receiver&gt;
  • 我试过了,但是当我关闭应用程序时它停止工作。我已经添加了我在清单中的注册方式,也许我做错了什么。
  • 我看到你解决了你的Service 问题,但你真的不需要它一直运行。您已禁用 &lt;receiver&gt;。要么将enabled 属性的值更改为true,要么直接删除它,并确保name 指向一个有效的BroadcastReceiver 类。您需要在安装后至少启动一次应用以使其退出 已停止 状态,但此后,只要连接发生变化,您的 Receiver 就会触发。

标签: java android


【解决方案1】:

我刚刚发现了问题。 Android 4.4.x 中有一个错误,它会在关闭应用程序时杀死后台服务。我在 Android 4.4.2 中测试我的应用程序。这里有详细解释:

http://www.androidpolice.com/2014/03/07/bug-watch-stopping-apps-on-android-4-4-2-can-silently-kill-related-background-services-a-fix-is-on-the-way/

所以我的代码是正确的,因为我在 Android 4.2.2 中尝试过并且它有效(我尝试过覆盖 onStartCommand(),所以也许需要这样做)。

【讨论】:

    【解决方案2】:

    如果您不希望您的服务在应用关闭时停止,您应该重写onStartCommand() 方法,执行如下操作:

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_REDELIVER_INTENT;
    }
    

    您可以返回START_STICKYSTART_REDELIVER_INTENT,选择更适合您的方式

    【讨论】:

    • 它不起作用。我认为当我关闭应用程序时服务可能没有停止,只是 BroadcastReceiver 停止工作,虽然我不确定。我的意思是故意关闭应用程序。用户在“最近的应用”屏幕上刷出应用后。
    • 您应该确定服务是否停止。尝试使用断点或查看 logcat 以检查是否调用了 onDestroy()
    • onDestroy() 未被调用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多