写在前面:
今天要实现的是按住按钮,启动服务,耗时10秒,发送广播,然后弹出弹窗,这涉及到服务,广播,弹窗。
1.服务
<font color=#999AAA > 1、onCreate():当Service第一次被创建后立即调用该方法,该方法在Service的生命周期里只被调用一次!
2、onDestory():当Service被关闭时调用该方法,该方法只被调用一次!
3、onStartCommand():当Service被调用时,调用该方法。该方法可被重复调用,并且不会创建新的Service对象,而是复用前面产生的Service对象。
4、onBind():这是Service必须实现的方法,该方法会返回一个IBinder对象,APP通过该对象与Service组件进行通信。
5、onUnBind():当该Service绑定的所有客户端都断开时调用该方法。</font>
(1).创建service:
和Activity类似
package com.example.task4;
import androidx.appcompat.app.AppCompatActivity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button btnStart;
private Button btnStop;
private Button btnStatus;
private Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnStart = findViewById(R.id.btn_start);
btnStop = findViewById(R.id.btn_stop);
btnStatus = findViewById(R.id.btn_status);
btnStart.setOnClickListener(this);
btnStop.setOnClickListener(this);
btnStatus.setOnClickListener(this);
AlertDialog alertDialog = new AlertDialog.Builder(this)
.setTitle("提示")
.setMessage("资源下载完成")
.setNeutralButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.create();
alertDialog.show();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_start: {
intent = new Intent(this, StartService.class);
startService(intent);
break;
}
case R.id.btn_stop: {
intent = new Intent(this, StartService.class);
stopService(intent);
break;
}
}
}
}
(2).在Activity绑定
package com.example.task4;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
import androidx.annotation.Nullable;
public class StartService extends Service {
private final String TAG = "StartServer";
@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.e(TAG, "onBind方法被调用");
return null;
}
//Service创建时调用
@Override
public void onCreate() {
Log.e(TAG,"onCreate方法被调用");
super.onCreate();
}
//Service被启动时调用
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e(TAG,"onStartCommand方法被调用");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
Log.e(TAG, "onDestroy方法被调用");
super.onDestroy();
}
}
(3).在AndroidManifest中注册Service
Android的四大组件,只有定义了,就必须去AndroidManifest.xml中注册一下
<service android:name=".StartService"
android:enabled="true"
android:exported="true"/>
其中enabled属性,是指该服务是否能够被实例化。如果设置为true,则能够被实例化,否则不能被实例化,默认值是true。
exported属性用于指示该服务是否能够被其他应用程序组件调用或跟它交互。如果设置为true,则能够被调用或交互(通常如果一个服务需要跨进程使用需要这么设置),否则不能。设置为false时,只有同一个应用程序的组件或带有相同用户ID的应用程序才能启动或绑定该服务。
效果
2.广播
Android动态注册广播分为四个步骤
1、动态注册广播
2、发送广播
3、接收广播
4、销毁广播
package com.example.task4;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
//自定义广播名称
private static final String DYNAMICACTION = "com.exampleTak4"; //动态广播的Action字符串
private Button sendmessage;
//定义接收器
private IBroadcast broadcastReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sendmessage = (Button)findViewById(R.id.button);
sendmessage.setOnClickListener(this);
}
//动态广播注册
@Override
protected void onPostResume(){
iBroadcast = new IBroadcast();
IntentFilter intentFilter = new IntentFilter();
//设置优先级的方式
intentFilter.addAction(DYNAMICACTION);
registerReceiver(iBroadcast,intentFilter);
}
//销毁广播
@Override
protected void onDestroy(){
super.onDestroy();
if(anotherBroadcastReceiver != null){
unregisterReceiver(IBroadcast);
}
}
//接收广播
private class IBroadcast extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this)
.setTitle("提示")
.setMessage("资源下载完成")
.setNeutralButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.create();
alertDialog.show();
}
}
//发送广播
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction(DYNAMICACTION);
sendBroadcast(intent);
//有序广播的发送函数
// sendOrderedBroadcast(intent,null);
}
}
3.弹窗
今天使用到的弹窗是AlertDialog:
setTitle | 为对话框设置标题 |
setIcon | 为对话框设置图标 |
setMessage | 为对话框设置内容 |
setView | 给对话框设置自定义样式 |
setItems | 设置对话框要显示的一个list,一般用于显示几个命令时 |
setMultiChoiceItems | 用来设置对话框显示一系列的复选框 |
setSingleChoiceItems | 用来设置对话框显示一系列的单选框 |
setNeutralButton | 普通按钮 |
setPositiveButton | 给对话框添加"Yes"按钮 |
setNegativeButton | 对话框添加"No"按钮 |
create | 创建对话框 |
show | 显示对话框 |
AlertDialog alertDialog = new AlertDialog.Builder(this)
.setTitle("提示") //
.setMessage("资源下载完成")
.setNeutralButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.create();
alertDialog.show();
总结:
这两天学习的服务,广播以及弹窗难度还是有一定的难度,对于这些知识,我了解的也比较片面,需要等以后在细看这些了。