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上最糟糕的事情