android 开启前台服务,并隐藏8.0以下的通知

1.首先在activityj里面启动

Intent intent = new Intent(MainActivity.this, MyService.class);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    startForegroundService(intent );
} else {
    startService(intent );
}

2.需要在前台运行的服务

public class MyService extends Service {
    private static final String ID = "channel_1";
    private static final String NAME = "前台服务";
    private final int PID = android.os.Process.myPid();
    private ServiceConnection mConnection;

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {//大于等于android O
            setForeground();
        } else {
            setForegrounds();
        }
        return super.onStartCommand(intent, flags, startId);
    }

    @TargetApi(Build.VERSION_CODES.O)
    private void setForeground() {//大于等于android O
        Intent intent = new Intent();//跳转到应用信息
        intent.setAction(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
        intent.setData(Uri.parse("package:" + PushService.this.getPackageName()));
        PendingIntent pendingIntent = PendingIntent.getActivity(PushService.this, 0, intent, 0);
        NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        NotificationChannel channel = new NotificationChannel(ID, NAME, NotificationManager.IMPORTANCE_HIGH);
        manager.createNotificationChannel(channel);
        Notification notification = new Notification.Builder(this, ID)
                .setSmallIcon(R.mipmap.app_logo)
                .setContentTitle(getResources().getString(R.string.foreground_title))
                .setContentText(getResources().getString(R.string.foreground_content))
                .setContentIntent(pendingIntent)//跳转到应用信息
                .build();
        startForeground(1, notification);// 开始前台服务
    }

    private void setForegrounds() {//小于android o 屏蔽前台通知
        if (null == mConnection) {
            mConnection = new CoverServiceConnection();
        }
        this.bindService(new Intent(this, HelpService.class), mConnection,
                Service.BIND_AUTO_CREATE);
    }

    private class CoverServiceConnection implements ServiceConnection {
        @Override
        public void onServiceDisconnected(ComponentName name) {
        }

        @Override
        public void onServiceConnected(ComponentName name, IBinder binder) {
            // 2个service分别startForeground,然后只在1个service里stopForeground,这样即可去掉通知栏的显示
            Service helpService = ((HelpService.LocalBinder) binder)
                    .getService();
            PushService.this.startForeground(PID, getNotification());
            helpService.startForeground(PID, getNotification());
            helpService.stopForeground(true);
            PushService.this.unbindService(mConnection);
            mConnection = null;
        }
    }

    private Notification getNotification() {
        Intent intent = new Intent();
        intent.setAction(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
        intent.setData(Uri.parse("package:" + PushService.this.getPackageName()));//跳转到应用信息
        PendingIntent pendingIntent = PendingIntent.getActivity(MyService.this, 0, intent, 0);
        Notification notification = new Notification.Builder(this.getApplicationContext())
                .setSmallIcon(R.mipmap.app_logo)
                .setContentTitle(getResources().getString(R.string.foreground_title))
                .setContentText(getResources().getString(R.string.foreground_content))
                .setContentIntent(pendingIntent)
                .build();
        return notification;
    }

    @Override
    public void onDestroy() {
        stopForeground(true);// 停止前台服务--参数:表示是否移除之前的通知
        super.onDestroy();
    }
}

 

3.小于8.0的隐藏通知的辅助服务

public class HelpService extends Service {

    public class LocalBinder extends Binder {
        public HelpService getService() {
            return HelpService.this;
        }
    }

    @Override
    public IBinder onBind(Intent intent) {
        return new LocalBinder();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

}

你可能感兴趣的:(前台服务的开启)