002 功能实现-前台Service

作者: 凤邪摩羯 | 来源:发表于2021-12-27 09:30 被阅读0次
  • 注意两点:

1、android5.0以后不能使用隐式intent :需要指定Intent的ComponentName信息
2、Android 8.0 有一项复杂功能;系统不允许后台应用创建后台服务。 因此,Android 8.0 引入了一种全新的方法,即 Context.startForegroundService(),以在前台启动新服务。

1 启动Activity

 Intent intent = new Intent();
        intent.setComponent(new ComponentName("com.huawei.anotherapp",
                        "com.huawei.anotherapp.MainActivity"));
        startActivity(intent);

2 启动Service

注意:

  1. service的android:exported="true"属性,千万要为true ;如果为false,意味着不允许其他应用启动此service;
  2. 注意8.0需要添加前台服务的权限
  • 服务配置
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.hjq.foreground">

    <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>


    <application android:theme="@style/AppTheme">

        <!--前台服务进程-->
        <service
            android:name="com.hjq.foreground.ForegroundService"
            android:exported="true"
            android:process=":foreground">

        </service>

        

    </application>

</manifest>
  • 判断版本使用不同启动方式
        Intent intent = new Intent();
        intent.setComponent(new ComponentName("com.huawei.anotherapp",
                        "com.huawei.anotherapp.MyService"));
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            startForegroundService(intent);
        } else {
            startService(intent);
        }
     }
  • 前台服务实现

用户当前操作所必需的进程。如果一个进程满足以下任一条件,即视为前台进程:

  1. 托管用户正在交互的 Activity(已调用 Activity 的 onResume() 方法)
  2. 托管某个 Service,后者绑定到用户正在交互的 Activity
  3. 托管正在“前台”运行的 Service(服务已调用 startForeground())
  4. 托管正执行一个生命周期回调的 Service(onCreate()、onStart() 或 onDestroy())
  5. 托管正执行其 onReceive() 方法的 BroadcastReceiver

通常,在任意给定时间前台进程都为数不多。只有在内存不足以支持它们同时继续运行这一万不得已的情况下,系统才会终止它们。 此时,设备往往已达到内存分页状态,因此需要终止一些前台进程来确保用户界面正常响应。

/**
 * 前台服务进程
 */
public class ForegroundService extends Service {
    private static final int SERVICE_ID = 1;


    @Override
    public void onCreate() {
        super.onCreate();
        LogUtils.e(" ForegroundService onCreate");
    }

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

    @RequiresApi(api = Build.VERSION_CODES.O)
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        //判断版本
        if (Build.VERSION.SDK_INT < 18) {//Android4.3以下版本

            //将Service设置为前台服务,可以取消通知栏消息
            startForeground(SERVICE_ID, new Notification());

        } else if (Build.VERSION.SDK_INT < 24) {//Android4.3 - 7.0之间
            //将Service设置为前台服务,可以取消通知栏消息
            startForeground(SERVICE_ID, new Notification());
//            startService(new Intent(this, InnerService.class));

        } else {//Android 8.0以上
            NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
            if (manager != null) {
                //修改安卓8.1以上系统报错
                NotificationChannel notificationChannel = new NotificationChannel("1", "CHANNEL_ONE_NAME", NotificationManager.IMPORTANCE_MIN);
                notificationChannel.enableLights(false);//如果使用中的设备支持通知灯,则说明此通知通道是否应显示灯
                notificationChannel.setShowBadge(false);//是否显示角标
                notificationChannel.setLockscreenVisibility(Notification.VISIBILITY_SECRET);
                manager.createNotificationChannel(notificationChannel);
                NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "channel");
                builder.setChannelId("1");
                Notification notification = builder.build(); // 获取构建好的 Notification
                notification.defaults = Notification.DEFAULT_SOUND; //设置为默认的声音
                startForeground(1, notification);
            }
        }

        return START_STICKY;
    }


    @Override
    public void onDestroy() {
        super.onDestroy();
        LogUtils.e(" ForegroundService onDestroy");

    }
}

相关文章

  • 002 功能实现-前台Service

    注意两点: 1、android5.0以后不能使用隐式intent :需要指定Intent的ComponentNam...

  • 前台 service

    private void startForeground() { String channelId ="com.t...

  • Service----前台Service

     Service的系统优先级是比较低的,当系统出现内存不足的情况时,就有可能会回收掉在后台运行的Service。如...

  • Kong 的Service和Route配置使用

    Kong的Service和Route实战 本文目标:实践Kong的service和route基础配置功能,实现简单...

  • nRF52832 DFU Service

    为了更好的实现DFU控制升级功能,为设备增加一个DFU Service,实现手机连接设备后修改此service中的...

  • Android内存优化汇总

    1.使用保守的Service实现模块内具体功能时,尽量避免以应用内常驻后台的Service方式实现。如果应用需要使...

  • 秒杀

    秒杀功能实现package com.xxxx.seckill.service;import com.baomido...

  • Kevin Learn Android:Service 使用

    Service 分类 按运行地点可以分为: 本地服务 远程服务 按运行类型可以分为: 前台服务 后台服务 按功能可...

  • MVC思想-03-24

    controller:分发任务service:各种逻辑判断,功能实现,业务处理dao:bean(pojo)

  • 关于安卓exoplayer的实现(一)

    基于exoplayer简单实现播放器功能: 实现思路: 1新建一个service,通过ServiceConnect...

网友评论

    本文标题:002 功能实现-前台Service

    本文链接:https://www.haomeiwen.com/subject/purrzktx.html