安卓四大组件

187 阅读7分钟

一、安卓四大组件总览

  1. Activity(活动)

    • Activity 是用户界面的表示,通常对应应用程序的一个屏幕。
    • 它用于用户交互,可以包含用户界面元素(视图)。
    • 每个 Activity 都有其生命周期,可以通过方法来管理,例如 onCreate、onStart、onResume 等。
    • 可以通过 Intent 启动其他 Activity。
  2. Service(服务)

    • Service 是在后台运行的组件,用于执行长时间运行的操作,例如下载、音乐播放等。
    • 它没有用户界面,通常在后台默默工作。
    • Service 有生命周期,包括 onCreate、onStartCommand、onBind 等。
    • Service 可以与 Activity 或其他应用程序组件进行通信。
  3. BroadcastReceiver(广播接收器)

    • BroadcastReceiver 用于响应系统广播或应用程序内部的广播事件。
    • 它可以在系统或应用程序内部的组件之间传递信息。
    • BroadcastReceiver 可以通过注册到系统或动态注册来接收广播事件,例如网络状态变化、电池状态变化等。
  4. ContentProvider(内容提供器)

    • ContentProvider 用于管理应用程序的数据,并提供数据访问接口给其他应用程序。
    • 它可以提供对数据的增删改查操作,并控制数据的访问权限。
    • ContentProvider 常用于访问共享数据,如联系人、媒体文件、数据库等。

二、安卓四大组件分别介绍

(1)Activity组件

  1. Activityandroid.app.Activity):这是所有 Android Activity 的基类,用于创建应用程序的界面和交互。

    • AppCompatActivityandroidx.appcompat.app.AppCompatActivity):这是 AndroidX 库中的类,允许在较旧版本的 Android 上使用现代的 Material Design 元素和功能。大多数应用程序的 Activity 继承自 AppCompatActivity
  2. FragmentActivityandroidx.fragment.app.FragmentActivity):这是 AndroidX 库中的 Activity,用于支持 Fragment 的管理。大多数使用 Fragment 的应用程序的 Activity 继承自 FragmentActivity 或其子类。

  3. ListActivityandroid.app.ListActivity):这是用于显示列表视图的 Activity 的基类。它包含了一个 ListView 控件,并提供了方便的方法用于填充列表数据。

  4. PreferenceActivityandroid.preference.PreferenceActivity):这是用于创建设置界面的 Activity 基类,可用于构建应用程序的首选项设置界面。

  5. CameraActivityandroid.hardware.Camera.CameraActivity):这是用于处理相机功能的 Activity 基类。

  6. SearchableActivityandroid.app.SearchableActivity):这是用于支持应用程序内搜索的 Activity 基类,通常与搜索框小部件结合使用。

  7. TabActivityandroid.app.TabActivity):这是用于创建带有选项卡标签的 Activity 的基类。但请注意,从Android 3.0(API级别11)开始,Google 不再推荐使用选项卡标签,而是鼓励使用 Action Bar 或 TabLayout。

  8. WebViewActivityandroid.webkit.WebViewActivity):这是用于在应用程序中显示 Web 内容的 Activity 基类。

android.app.Activity 类是 Android 应用程序中的一个重要组件,用于表示用户界面的一部分并处理与用户交互的逻辑。以下是一些常见的 Activity 类的属性和方法:

属性(成员变量):

  1. Intent:表示启动 Activity 的意图(Intent)。
  2. Context:表示 Activity 的上下文,允许访问应用程序的资源和系统服务。
  3. Bundle:用于保存和传递 Activity 的状态信息。
  4. Window:表示 Activity 的窗口,可用于设置窗口属性。
  5. FragmentManager:用于管理 Fragment 的对象。
  6. ActionBar/Toolbar:表示 Activity 的操作栏或工具栏,用于显示菜单项和其他操作。
  7. View:表示 Activity 的根视图,可以通过它访问和操作界面元素。
  8. IntentFilter:用于声明 Activity 可以响应的 Intent 过滤器,通常与 BroadcastReceiver 一起使用。

方法:

  1. onCreate(Bundle savedInstanceState) :Activity 的创建方法,用于初始化界面和资源。
  2. onStart() :Activity 变得可见但尚未可交互时调用。
  3. onResume() :Activity 变得可见且可交互时调用。
  4. onPause() :Activity 即将失去焦点,但仍可见时调用。
  5. onStop() :Activity 不再可见时调用。
  6. onDestroy() :Activity 即将销毁时调用。
  7. onRestart() :Activity 从停止状态重新启动时调用。
  8. onSaveInstanceState(Bundle outState) :用于保存 Activity 状态信息的方法,以便在重新创建时恢复。
  9. onRestoreInstanceState(Bundle savedInstanceState) :用于恢复保存的 Activity 状态信息的方法。
  10. setContentView(int layoutResID) :用于设置 Activity 的界面布局。
  11. startActivity(Intent intent) :启动另一个 Activity。
  12. startActivityForResult(Intent intent, int requestCode) :启动另一个 Activity,并等待其返回结果。
  13. setResult(int resultCode, Intent data) :设置返回给调用者的结果数据。
  14. finish() :关闭当前 Activity。
  15. onActivityResult(int requestCode, int resultCode, Intent data) :处理启动子 Activity 后返回的结果。
  16. 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 + "%");
    }
}

(3)BroadcastReceiver(广播接收器)

(4)ContentProvider(内容提供器)