Android开发Android开发经验谈Android技术知识

002 功能实现-前台Service

2021-12-27  本文已影响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");

    }
}

上一篇 下一篇

猜你喜欢

热点阅读