一、安卓四大组件总览
-
Activity(活动) :
- Activity 是用户界面的表示,通常对应应用程序的一个屏幕。
- 它用于用户交互,可以包含用户界面元素(视图)。
- 每个 Activity 都有其生命周期,可以通过方法来管理,例如 onCreate、onStart、onResume 等。
- 可以通过 Intent 启动其他 Activity。
-
Service(服务) :
- Service 是在后台运行的组件,用于执行长时间运行的操作,例如下载、音乐播放等。
- 它没有用户界面,通常在后台默默工作。
- Service 有生命周期,包括 onCreate、onStartCommand、onBind 等。
- Service 可以与 Activity 或其他应用程序组件进行通信。
-
BroadcastReceiver(广播接收器) :
- BroadcastReceiver 用于响应系统广播或应用程序内部的广播事件。
- 它可以在系统或应用程序内部的组件之间传递信息。
- BroadcastReceiver 可以通过注册到系统或动态注册来接收广播事件,例如网络状态变化、电池状态变化等。
-
ContentProvider(内容提供器) :
- ContentProvider 用于管理应用程序的数据,并提供数据访问接口给其他应用程序。
- 它可以提供对数据的增删改查操作,并控制数据的访问权限。
- ContentProvider 常用于访问共享数据,如联系人、媒体文件、数据库等。
二、安卓四大组件分别介绍
(1)Activity组件
-
Activity(
android.app.Activity):这是所有 Android Activity 的基类,用于创建应用程序的界面和交互。- AppCompatActivity(
androidx.appcompat.app.AppCompatActivity):这是 AndroidX 库中的类,允许在较旧版本的 Android 上使用现代的 Material Design 元素和功能。大多数应用程序的 Activity 继承自AppCompatActivity。
- AppCompatActivity(
-
FragmentActivity(
androidx.fragment.app.FragmentActivity):这是 AndroidX 库中的 Activity,用于支持 Fragment 的管理。大多数使用 Fragment 的应用程序的 Activity 继承自FragmentActivity或其子类。 -
ListActivity(
android.app.ListActivity):这是用于显示列表视图的 Activity 的基类。它包含了一个 ListView 控件,并提供了方便的方法用于填充列表数据。 -
PreferenceActivity(
android.preference.PreferenceActivity):这是用于创建设置界面的 Activity 基类,可用于构建应用程序的首选项设置界面。 -
CameraActivity(
android.hardware.Camera.CameraActivity):这是用于处理相机功能的 Activity 基类。 -
SearchableActivity(
android.app.SearchableActivity):这是用于支持应用程序内搜索的 Activity 基类,通常与搜索框小部件结合使用。 -
TabActivity(
android.app.TabActivity):这是用于创建带有选项卡标签的 Activity 的基类。但请注意,从Android 3.0(API级别11)开始,Google 不再推荐使用选项卡标签,而是鼓励使用 Action Bar 或 TabLayout。 -
WebViewActivity(
android.webkit.WebViewActivity):这是用于在应用程序中显示 Web 内容的 Activity 基类。
android.app.Activity 类是 Android 应用程序中的一个重要组件,用于表示用户界面的一部分并处理与用户交互的逻辑。以下是一些常见的 Activity 类的属性和方法:
属性(成员变量):
- Intent:表示启动 Activity 的意图(Intent)。
- Context:表示 Activity 的上下文,允许访问应用程序的资源和系统服务。
- Bundle:用于保存和传递 Activity 的状态信息。
- Window:表示 Activity 的窗口,可用于设置窗口属性。
- FragmentManager:用于管理 Fragment 的对象。
- ActionBar/Toolbar:表示 Activity 的操作栏或工具栏,用于显示菜单项和其他操作。
- View:表示 Activity 的根视图,可以通过它访问和操作界面元素。
- IntentFilter:用于声明 Activity 可以响应的 Intent 过滤器,通常与 BroadcastReceiver 一起使用。
方法:
- onCreate(Bundle savedInstanceState) :Activity 的创建方法,用于初始化界面和资源。
- onStart() :Activity 变得可见但尚未可交互时调用。
- onResume() :Activity 变得可见且可交互时调用。
- onPause() :Activity 即将失去焦点,但仍可见时调用。
- onStop() :Activity 不再可见时调用。
- onDestroy() :Activity 即将销毁时调用。
- onRestart() :Activity 从停止状态重新启动时调用。
- onSaveInstanceState(Bundle outState) :用于保存 Activity 状态信息的方法,以便在重新创建时恢复。
- onRestoreInstanceState(Bundle savedInstanceState) :用于恢复保存的 Activity 状态信息的方法。
- setContentView(int layoutResID) :用于设置 Activity 的界面布局。
- startActivity(Intent intent) :启动另一个 Activity。
- startActivityForResult(Intent intent, int requestCode) :启动另一个 Activity,并等待其返回结果。
- setResult(int resultCode, Intent data) :设置返回给调用者的结果数据。
- finish() :关闭当前 Activity。
- onActivityResult(int requestCode, int resultCode, Intent data) :处理启动子 Activity 后返回的结果。
- onBackPressed() :处理返回按钮的点击事件
(2)Service活动
service的生命周期
1. **onCreate()** :
- 当 Service 被创建时调用。这个方法只会在 Service 第一次创建时被调用,之后再次启动 Service 不会再调用它。通常在这里进行一次性的初始化工作,例如创建资源或设置初始状态。
1. **onStartCommand(Intent intent, int flags, int startId)** :
- 当调用 `startService()` 方法启动 Service 时,这个方法被调用。它接收三个参数:
- `intent`:包含启动 Service 的意图,通常包含了传递给 Service 的数据。
- `flags`:指示启动请求的标志。
- `startId`:用于标识本次启动请求的唯一标识。
- 在这个方法中,通常执行后台任务或处理 Service 的工作。如果 Service 被多次启动,该方法可以多次被调用。
1. **onBind(Intent intent)** :
- 如果 Service 具备绑定接口,这个方法会被调用以响应绑定请求。它接收一个 `intent` 参数,通常包含了与绑定请求相关的数据。如果 Service 不提供绑定接口,可以返回 `null`。
1. **onUnbind(Intent intent)** :
- 当与 Service 绑定的所有客户端都解绑时,这个方法被调用。它接收一个 `intent` 参数,通常包含了与解绑请求相关的数据。如果 Service 不提供绑定接口,这个方法可能不会被实现。
1. **onRebind(Intent intent)** :
- 当一个已经绑定的 Service 被重新绑定时,这个方法被调用。它接收一个 `intent` 参数,通常包含了重新绑定请求相关的数据。
1. **onDestroy()** :
- 当 Service 即将被销毁时调用。在这里通常进行清理工作,释放资源,停止后台任务等。
1、service的基本使用:
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
public class MusicService extends Service {
private static final String TAG = "MusicService";
private MediaPlayer mediaPlayer;
public MusicService() {
}
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "onCreate: MusicService is created.");
mediaPlayer = MediaPlayer.create(this, R.raw.music); // 创建 MediaPlayer 并加载音乐文件
mediaPlayer.setLooping(true); // 设置音乐循环播放
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "onStartCommand: MusicService is started.");
if (!mediaPlayer.isPlaying()) {
mediaPlayer.start(); // 播放音乐
}
return START_STICKY; // 表示 Service 在被终止后会尝试重新启动
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy: MusicService is destroyed.");
if (mediaPlayer != null) {
mediaPlayer.stop(); // 停止音乐播放
mediaPlayer.release(); // 释放 MediaPlayer 资源
}
}
@Override
public IBinder onBind(Intent intent) {
return new MusicBinder(); // 返回一个 Binder 对象用于绑定
}
public class MusicBinder extends Binder {
public MusicService getService() {
return MusicService.this;
}
}
}
2、 在 AndroidManifest.xml 文件中注册您的 Service:
<service android:name=".MusicService" />
3、activity里面的代码
import androidx.appcompat.app.AppCompatActivity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
private MusicService musicService;
private boolean isBound = false;
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
MusicService.MusicBinder binder = (MusicService.MusicBinder) iBinder;
musicService = binder.getService();
isBound = true;
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
musicService = null;
isBound = false;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button startButton = findViewById(R.id.start_button);
Button stopButton = findViewById(R.id.stop_button);
startButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startMusicService();
}
});
stopButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
stopMusicService();
}
});
}
private void startMusicService() {
Intent serviceIntent = new Intent(this, MusicService.class);
startService(serviceIntent);
if (!isBound) {
bindService(serviceIntent, serviceConnection, Context.BIND_AUTO_CREATE);
}
}
private void stopMusicService() {
if (isBound) {
unbindService(serviceConnection);
isBound = false;
}
Intent serviceIntent = new Intent(this, MusicService.class);
stopService(serviceIntent);
}
@Override
protected void onDestroy() {
super.onDestroy();
stopMusicService();
}
}
下面是一个下载文件的service实现的demo示例:
1、service代码:
import android.app.Service;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Environment;
import android.os.IBinder;
import android.util.Log;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class DownloadService extends Service {
private static final String TAG = "DownloadService";
private DownloadTask downloadTask;
public static final String ACTION_DOWNLOAD_PROGRESS = "com.example.app.DOWNLOAD_PROGRESS";
public static final String EXTRA_PROGRESS = "progress";
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "onCreate: Service is created.");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "onStartCommand: Service is started.");
if (downloadTask == null || downloadTask.getStatus() == AsyncTask.Status.FINISHED) {
downloadTask = new DownloadTask();
downloadTask.execute("URL_OF_YOUR_FILE");
}
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
if (downloadTask != null) {
downloadTask.cancel(true);
}
Log.d(TAG, "onDestroy: Service is destroyed.");
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
private class DownloadTask extends AsyncTask<String, Integer, String> {
@Override
protected String doInBackground(String... params) {
String fileUrl = params[0];
String fileName = "downloaded_file.mp3"; // 设置要保存的文件名
String filePath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString();
try {
URL url = new URL(fileUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.connect();
int fileLength = connection.getContentLength();
InputStream input = connection.getInputStream();
File outputFile = new File(filePath, fileName);
FileOutputStream output = new FileOutputStream(outputFile);
byte[] buffer = new byte[1024];
int length;
int total = 0;
while ((length = input.read(buffer)) != -1) {
output.write(buffer, 0, length);
total += length;
publishProgress((int) (total * 100 / fileLength)); // 发送下载进度
}
output.close();
input.close();
connection.disconnect();
return filePath + "/" + fileName;
} catch (Exception e) {
Log.e(TAG, "Error while downloading: " + e.getMessage());
}
return null;
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
int progress = values[0];
sendDownloadProgressBroadcast(progress); // 发送下载进度广播
}
@Override
protected void onPostExecute(String result) {
if (result != null) {
Log.d(TAG, "Downloaded file saved at: " + result);
sendDownloadProgressBroadcast(100); // 下载完成时发送100%的进度
} else {
Log.d(TAG, "Download failed.");
}
}
}
private void sendDownloadProgressBroadcast(int progress) {
Intent intent = new Intent(ACTION_DOWNLOAD_PROGRESS);
intent.putExtra(EXTRA_PROGRESS, progress);
sendBroadcast(intent);
}
}
2、activity中的代码
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import android.widget.ProgressBar;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private ProgressBar progressBar;
private TextView progressText;
private BroadcastReceiver receiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
progressBar = findViewById(R.id.progressBar);
progressText = findViewById(R.id.progressText);
// 注册广播接收器
IntentFilter filter = new IntentFilter(DownloadService.ACTION_DOWNLOAD_PROGRESS);
receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(DownloadService.ACTION_DOWNLOAD_PROGRESS)) {
int progress = intent.getIntExtra(DownloadService.EXTRA_PROGRESS, 0);
updateProgress(progress);
}
}
};
LocalBroadcastManager.getInstance(this).registerReceiver(receiver, filter);
// 启动下载服务
startDownloadService();
}
@Override
protected void onDestroy() {
super.onDestroy();
// 在Activity销毁时解除广播接收器的注册
LocalBroadcastManager.getInstance(this).unregisterReceiver(receiver);
}
private void startDownloadService() {
Intent serviceIntent = new Intent(this, DownloadService.class);
startService(serviceIntent);
}
private void updateProgress(int progress) {
progressBar.setProgress(progress);
progressText.setText(progress + "%");
}
}