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

时间:2019-12-18 09:04:54

标签: android service broadcastreceiver android-8.0-oreo

我开发了一个小型应用程序,无论何时在所有情况下关闭或运行,都可以检测到onoff或从WifiEthernet的连接更改。 / p>

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();
            }
        }
    }
} 

MySevice.java文件

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;
    }
}

Manifest.xml文件

<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>

注意:如果我在startForeground(101, notification);类的onCreate中调用MyService,则我上面的代码可以正常工作,但显示为永久{最不需要的状态栏上的{1}}图标。

1 个答案:

答案 0 :(得分:1)

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

糟透了,许多有用的应用程序无法正常运行和运行。

他们建议使用ForegroundService,它需要显示通知。

这几乎可以,但是这些ForegroundServices也会在一段时间后被杀死。

为避免杀死它们,您需要进行BatteryOptimization提示,以便用户允许服务在后台运行而不被杀死。

但是它还没有结束。在大多数制造商(如三星,华为等)中,服务仍被杀死,因为它们自身执行得不好的BatteryOptimizations与本机并行运行...并且如果用户希望某些应用程序避免在后台运行时被杀死,因此它必须走很长的路要进行设置才能找到提供程序特定的设置并让应用程序运行。...

这是一个示例,如何在Slack

上更改这些提供程序特定的设置

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