一、startService 服务的使用
1、创建一个MyService服务
public class MyService extends Service {
private static final String TAG = "MyService";
private Context context;
public MyService() {
}
@Override
public IBinder onBind(Intent intent) {
Log.d(TAG, "onBind()");
return null;
}
@Override
public void onCreate() {
Log.e(TAG, "onCreate()");
context = this;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e(TAG, "onStartCommand()");
showDialog();
return super.onStartCommand(intent, flags, startId);
}
// 调用startService方法启动Service时调用该方法
@Override
public void onStart(Intent intent, int startId) {
Log.e(TAG, "onStart()");
}
@Override
public void onDestroy() {
Log.e(TAG, "onDestroy()");
}
public void showDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext());
View view = View.inflate(context, R.layout.activity_dialog_view, null);
AlertDialog dialog = builder.create();
dialog.setView(view);
//8.0系统加强后台管理,禁止在其他应用和窗口弹提醒弹窗,如果要弹,必须使用TYPE_APPLICATION_OVERLAY
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {//8.0新特性
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY - 1);
} else {
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_TOAST);
}
dialog.show();
Window dialogWindow = dialog.getWindow();//获取window对象
dialogWindow.setGravity(Gravity.CENTER);//设置对话框位置
}
}
被启动的服务的生命周期:如果一个Service被某个Activity 调用 Context.startService 方法启动,那么不管是否有Activity使用bindService绑定或unbindService解除绑定到该Service,该Service都在后台运行。如果一个Service被startService 方法多次启动,那么onCreate方法只会调用一次,onStart将会被调用多次(对应调用startService的次数),并且系统只会创建Service的一个实例(因此你应该知道只需要一次stopService调用)。该Service将会一直在后台运行,而不管对应程序的Activity是否在运行,直到被调用stopService,或自身的stopSelf方法。当然如果系统资源不足,android系统也可能结束服务
生命周期方法说明
onStartCommand()
当另一个组件(如 Activity)通过调用 startService() 请求启动服务时,系统将调用此方法。一旦执行此方法,服务即会启动并可在后台无限期运行。 如果您实现此方法,则在服务工作完成后,需要由您通过调用 stopSelf() 或 stopService() 来停止服务。(如果您只想提供绑定,则无需实现此方法。)
onCreate()
首次创建服务时,系统将调用此方法来执行一次性设置程序(在调用 onStartCommand() 或 onBind() 之前)。如果服务已在运行,则不会调用此方法。
onDestroy()
当服务不再使用且将被销毁时,系统将调用此方法。服务应该实现此方法来清理所有资源,如线程、注册的侦听器、接收器等。 这是服务接收的最后一个调用
2019-12-02 22:16:47.294 16179-16179/com.example.myapplication E/MyService: onCreate()
2019-12-02 22:16:47.294 16179-16179/com.example.myapplication E/MyService: onStartCommand()
2019-12-02 22:16:47.401 16179-16179/com.example.myapplication E/MyService: onStart()
2019-12-02 22:16:51.362 16179-16179/com.example.myapplication E/MyService: onStartCommand()
2019-12-02 22:16:51.443 16179-16179/com.example.myapplication E/MyService: onStart()
2019-12-02 22:16:57.178 16179-16179/com.example.myapplication E/MyService: onStartCommand()
2019-12-02 22:16:57.272 16179-16179/com.example.myapplication E/MyService: onStart()
2、在AndroidManifest.xml中定义一个服务
android:name="com.example.myapplication.MyService" >
3、启动服务
Intent intentOne = new Intent(MainActivity.this, MyService.class);
startService(intentOne);
二、AlertDialog使用
1、自定义AlertDialog的布局文件activity_dialog_view
"1.0" encoding="utf-8"?>
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:orientation="vertical"
android:background="#FF6347"
android:gravity="center"
android:layout_height="match_parent">
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18dp"
android:text="你使用的卡不存在"/>
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="你使用的"/>
android:layout_width="wrap_content"
android:textSize="20dp"
android:layout_height="wrap_content"
android:textColor="#FF0000"
android:text="【我知道的】"/>
2、Service中AlertDialog全局对话框需要添加的权限
android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />
3、在代码中使用
public void showDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext());
View view = View.inflate(context, R.layout.activity_dialog_view, null);
AlertDialog dialog = builder.create();
dialog.setView(view);
//8.0系统加强后台管理,禁止在其他应用和窗口弹提醒弹窗,如果要弹,必须使用TYPE_APPLICATION_OVERLAY
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {//8.0新特性
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY - 1);
} else {
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_TOAST);
}
dialog.show();
Window dialogWindow = dialog.getWindow();//获取window对象
dialogWindow.setGravity(Gravity.CENTER);//设置对话框位置
}