- 注意两点:
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
注意:
- service的android:exported="true"属性,千万要为true ;如果为false,意味着不允许其他应用启动此service;
- 注意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);
}
}
- 前台服务实现
用户当前操作所必需的进程。如果一个进程满足以下任一条件,即视为前台进程:
- 托管用户正在交互的 Activity(已调用 Activity 的 onResume() 方法)
- 托管某个 Service,后者绑定到用户正在交互的 Activity
- 托管正在“前台”运行的 Service(服务已调用 startForeground())
- 托管正执行一个生命周期回调的 Service(onCreate()、onStart() 或 onDestroy())
- 托管正执行其 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");
}
}
网友评论