首页 > 解决方案 > 我无法在android后台运行服务

问题描述

我在android后台运行服务,我有一些问题。在 Android Oreo 版本上,我尝试使用 AlarmService 和StartForegroundService()在 android 中运行无尽的服务。
但我没有结果。

我的测试设备是小米、YunOS、华为,android版本是9.0、4.4和YunOS 5.1
起初,当mainactivity运行和next close时,在onResume()和函数中,我使用ReceiveronPause()启动服务startforegroundservice()和函数。 有一些代码如下:startservice()

- MainActivity

public void onResume() {
    mContext.stopService(new Intent(mContext, AppService.class));
}

public void onPause() {
    Intent intent = new Intent(mContext, RestartReceiver.class);
    intent.setAction("ACTION_REBOOT");
    mContext.sendBroadcast(intent);
}

-RestartReceiver

@Override
public void onReceive(Context context, Intent intent) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
    {
        context.startForegroundService(new Intent(context, 
        AppForegroundService.class));
    } else {
        context.startService(new Intent(context, AppService.class));
    }
}

- AppForegroundService



     @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            ToastUtil.showToast(this, "AppForegroundService onStartCommand");
            Log.d(TAG, "onStartCommand");
            startForeground(startId, getStartNotification());
            startService(new Intent(this, AppService.class));
            stopSelf();
            return START_STICKY;
        }

- AppService

@Override
public void onDestroy() {
    RestartAlarm();
    Log.d(TAG, "onDestroy: service done");
    ToastUtil.showToast(this, "onDestroy: service done");
}
private void RestartAlarm()
{
    ToastUtil.showToast(this, "Start AlarmService");
    Intent intent = new Intent(this, RestartReceiver.class);
    intent.setAction("ACTION_RESTART");
    sendBroadcast(intent);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, 
    intent, 0);
    long firstTime = SystemClock.elapsedRealtime();
    Log.d(TAG, "RestartAlarm: " + firstTime);
    firstTime += 1000;

    AlarmManager alarmManager = (AlarmManager) 
    getSystemService(Context.ALARM_SERVICE);
    alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
    firstTime, 1000, pendingIntent);
}

- Manifest.xml

<service
    android:name=".service.AppService"
    android:enabled="true"
    android:exported="true"
    android:stopWithTask="false"/>
<service android:name=".service.AppForegroundService"
    android:enabled="true"
    android:exported="true"/>
<receiver
    android:enabled="true"
    android:exported="true"
    android:name=".service.AutoStartReceiver"
    android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
    <intent-filter>
        <action android:name="ACTION_REBOOT" />
        <action android:name="android.intent.action.BOOT_COMPLETED" 
        android:priority="999"/>
        </intent-filter>
</receiver>
<receiver
    android:name=".service.RestartReceiver"
    android:enabled="true">
    <intent-filter>
        <action android:name="ACTION_RESTART"/>
    </intent-filter>
</receiver>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" 
/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" 
/>
<uses-permission
    android:name="android.permission.READ_PHONE_STATE"
    android:required="false" />
<!-- 网络 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" 
/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" 
/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission
    android:name="android.permission.ACCESS_FINE_LOCATION"
    android:required="false" />
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<!-- added from 2.7.2 -->
<uses-permission
    android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"
    android:required="false" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission 
android:name="android.permission.INSTANT_APP_FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission 
android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

<uses-permission android:name="android.permission.SET_ACTIVITY_WATCHER" 
/>
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.VIBRATE" />

我究竟做错了什么?

标签: androidnotificationsbackgroundintentservice

解决方案


对于某些设备制造商在应用程序关闭时不允许服务在后台运行,您无能为力,这是杀死服务的操作系统,但是如果您确实需要在后台运行服务,您需要授予应用程序自启动权限!


推荐阅读