在Boot api 29

问题描述

我尝试通过 broadcastReceiver 在启动时启动 ForegroundService 。我已经在装有Android 8的设备和模拟的Android 10设备上尝试过此操作。两者都工作正常。问题是,此代码在我的Android 10 galaxy S9上不起作用。我已经调试了所有内容包括 broadcastReceiver OnStartCommand 方法,但是如果 broadcastReceiver 运行的代码很好,则 OnStartCommand >方法无法开始运行。 我有一个mainActivity,用户必须在其中应用此流程,以便在 broadcastReceiver 正常工作之前打开应用一次。 我尝试了在这里找到的几乎所有解决方案,但没有任何解决方案。 我不明白为什么这可以在某些设备上使用,但不能在每个设备上使用。我希望有人能帮助我!

我的最小API是26。

广播接收器

public class Restarter extends broadcastReceiver {
   

    @Override
    public void onReceive(Context context,Intent intent) {



        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

            Intent intentt = new Intent (context,MyService.class);
            intentt.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startForegroundService(intentt);                

        } else {
            Intent intentt = new Intent (context,MyService.class);
            intentt.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startService(intentt);
        }
    }
}

服务

public class MyService extends Service {

    public static final String CHANNEL_ID = "exampleServiceChannel";
    

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d("WhereAreWe","create");
        createNotificationChannel();
    }

    private void createNotificationChannel() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel serviceChannel = new NotificationChannel(
                    CHANNEL_ID,"Foreground Service Channel",notificationmanager.IMPORTANCE_DEFAULT


            );
            notificationmanager manager = getSystemService(notificationmanager.class);
            manager.createNotificationChannel(serviceChannel);
        }
    }

    @Override
    public int onStartCommand(Intent intent,int flags,int startId) {
        super.onStartCommand(intent,flags,startId);
        Log.d("WhereAreWe","StartCommand");
        SharedPreferences check = getSharedPreferences("Checked",Context.MODE_PRIVATE);

        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.O){

            Intent intents = new Intent(this,MainActivity.class);
            intents.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
            PendingIntent pendingIntent = PendingIntent.getActivity(this,intents,0);
            NotificationCompat.Builder builder = new NotificationCompat.Builder(this,"newid")
                .setSmallIcon(R.drawable.ic_android)
                .setContentTitle("Foreground Service")
                .setContentText("Example text")
                .setongoing(true)
                .setPriority(NotificationCompat.PRIORITY_DEFAULT)
                .setContentIntent(pendingIntent);

            startForeground(1,builder.build());
        }else{
                startForeground(1,new Notification());
        }
    }
    
}

清单

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.MyApplication">
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.SYstem_ALERT_WINDOW" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <application
        .
        .
        .
        <receiver
            android:name=".Restarter"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="restartservice" />
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.QUICKBOOT_POWERON" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>

        <service
            android:name=".MyService"
            android:enabled="true"
            android:exported="true"
            android:stopWithTask="false" />
    </application>
</manifest>

解决方法

在您的android:usesCleartextTraffic="true" application中设置manifest