Android 应用程序在Oreo上终止时,服务未在后台运行

Android 应用程序在Oreo上终止时,服务未在后台运行,android,service,broadcastreceiver,android-8.0-oreo,Android,Service,Broadcastreceiver,Android 8.0 Oreo,我开发了一个小应用程序,可以检测网络中的变化,如打开,关闭,或连接将Wifi更改为以太网,无论何时应用程序关闭或运行 为我提供的代码在Nuget 7之前有效,当在Oreo 8中测试应用程序时,后台服务在应用程序终止时不工作 我如何让它在Oreo中工作 public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState)

我开发了一个小应用程序,可以检测网络中的变化,如
打开
关闭
,或连接将
Wifi
更改为
以太网
,无论何时应用程序关闭或运行

为我提供的代码在
Nuget 7
之前有效,当在
Oreo 8
中测试应用程序时,后台服务在应用程序终止时不工作

我如何让它在Oreo中工作

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Intent vpnServiceIntent = new Intent(getBaseContext(), MyService.class);
        startForegroundService(vpnServiceIntent);}}
WifiReceiver.java
文件

public class WifiReceiver extends BroadcastReceiver {

    static final String CONNECTIVITY_CHANGE_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";
    @Override
    public void onReceive(Context context, Intent intent) {

        String action = intent.getAction();
        if (CONNECTIVITY_CHANGE_ACTION.equals(action)) {

            if (!isConnected()) {
                if (context != null) {

                    Toast.makeText(context," Not connected...",Toast.LENGTH_LONG).show();
                }
            } else {

                Toast.makeText(context,"connected...",Toast.LENGTH_LONG).show();
            }
        }
    }
} 
public class MyService extends Service
{
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        IntentFilter filter = new IntentFilter();
        filter.addAction("android.net.conn.CONNECTIVITY_CHANGE");

        WifiReceiver receiver =new WifiReceiver();

        registerReceiver(receiver,filter);
        return START_STICKY;
    }
}
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application
    <receiver android:name=".WifiReceiver">
        <intent-filter>
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
        </intent-filter>
    </receiver>
    <service android:name=".MyService" />
</application>
myevice.java
文件

public class WifiReceiver extends BroadcastReceiver {

    static final String CONNECTIVITY_CHANGE_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";
    @Override
    public void onReceive(Context context, Intent intent) {

        String action = intent.getAction();
        if (CONNECTIVITY_CHANGE_ACTION.equals(action)) {

            if (!isConnected()) {
                if (context != null) {

                    Toast.makeText(context," Not connected...",Toast.LENGTH_LONG).show();
                }
            } else {

                Toast.makeText(context,"connected...",Toast.LENGTH_LONG).show();
            }
        }
    }
} 
public class MyService extends Service
{
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        IntentFilter filter = new IntentFilter();
        filter.addAction("android.net.conn.CONNECTIVITY_CHANGE");

        WifiReceiver receiver =new WifiReceiver();

        registerReceiver(receiver,filter);
        return START_STICKY;
    }
}
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application
    <receiver android:name=".WifiReceiver">
        <intent-filter>
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
        </intent-filter>
    </receiver>
    <service android:name=".MyService" />
</application>
Manifest.xml
文件

public class WifiReceiver extends BroadcastReceiver {

    static final String CONNECTIVITY_CHANGE_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";
    @Override
    public void onReceive(Context context, Intent intent) {

        String action = intent.getAction();
        if (CONNECTIVITY_CHANGE_ACTION.equals(action)) {

            if (!isConnected()) {
                if (context != null) {

                    Toast.makeText(context," Not connected...",Toast.LENGTH_LONG).show();
                }
            } else {

                Toast.makeText(context,"connected...",Toast.LENGTH_LONG).show();
            }
        }
    }
} 
public class MyService extends Service
{
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        IntentFilter filter = new IntentFilter();
        filter.addAction("android.net.conn.CONNECTIVITY_CHANGE");

        WifiReceiver receiver =new WifiReceiver();

        registerReceiver(receiver,filter);
        return START_STICKY;
    }
}
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application
    <receiver android:name=".WifiReceiver">
        <intent-filter>
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
        </intent-filter>
    </receiver>
    <service android:name=".MyService" />
</application>

由于安卓8.0(API级别26),由于电池优化和安全原因,应用程序不可见时,基本上不可能运行后台服务

这太糟糕了,许多有用的应用程序无法正常运行和工作

他们建议使用需要显示通知的
ForegroundService

这几乎没问题,但这些
前台服务也会在一段时间后被杀死

为了避免杀死它们,您需要进行
batteryooptimization
提示,这样用户就可以让服务在后台运行而不会杀死它们

但它还没有结束。。。三星、华为等大多数制造商的服务仍在被扼杀,因为他们自己的
电池优化实施得很差
与本地优化并行运行。。。若用户希望某些应用程序在后台运行时避免被杀掉,那个么它必须通过设置找到特定于提供商的设置并让应用程序运行

下面是一个如何在上更改这些特定于提供程序的设置的示例

我认为这是安卓发生的最糟糕的事情….

自从安卓8.0(API级别26)以来,由于电池优化和安全原因,当应用程序不可见时,基本上不可能运行后台服务

这太糟糕了,许多有用的应用程序无法正常运行和工作

他们建议使用需要显示通知的
ForegroundService

这几乎没问题,但这些
前台服务也会在一段时间后被杀死

为了避免杀死它们,您需要进行
batteryooptimization
提示,这样用户就可以让服务在后台运行而不会杀死它们

但它还没有结束。。。三星、华为等大多数制造商的服务仍在被扼杀,因为他们自己的
电池优化实施得很差
与本地优化并行运行。。。若用户希望某些应用程序在后台运行时避免被杀掉,那个么它必须通过设置找到特定于提供商的设置并让应用程序运行

下面是一个如何在上更改这些特定于提供程序的设置的示例

我认为这是发生在Android上最糟糕的事情