Activity登堂入室

感谢你提到 Activity 登堂入室!“登堂入室”意味着你在 Android 开发中对 Activity 已经有了一定基础,想要深入掌握更高级的用法和技巧。作为 Android 应用的核心组件,Activity 不仅负责 UI 展示和用户交互,还涉及复杂的生命周期管理、状态保存、组件集成及性能优化。本回答将为“登堂入室”阶段的学习者提供深入的 Activity 使用指南,结合你之前提到的组件(AlertDialogPopupWindowMenuViewPager2DrawerLayoutTextWatcherConfigurationAsyncTaskGestures)以及相关话题(HandlerOnTouchListeneronTouchEvent多点触碰),通过一个综合示例展示高级功能,包括多 Activity 导航、复杂手势、异步任务优化和状态管理。同时提供优化建议、常见问题解决和进阶技巧。如果你的需求涉及特定场景(如复杂 UI、跨 Activity 数据传递、性能优化)或有具体问题,请提供更多细节,我可以进一步定制答案。


1. Activity 高级概念

核心回顾

  • 定义Activity 是 Android 四大组件之一,代表一个用户界面,通常对应一个屏幕,继承自 AppCompatActivity(兼容旧设备)。
  • 生命周期onCreateonStartonResumeonPauseonStoponDestroyonRestart,管理 UI 和资源。
  • 高级功能
  • 多 Activity 导航:通过 Intent 实现页面跳转和数据传递。
  • 复杂交互:结合手势(GestureDetectorScaleGestureDetector)、异步任务(AsyncTask)和事件监听(TextWatcher)。
  • 状态管理:处理屏幕旋转、进程恢复(onSaveInstanceStateonRestoreInstanceState)。
  • 性能优化:避免内存泄漏、优化 UI 响应。
  • 组件集成:与 FragmentViewPager2DrawerLayout 等协作实现复杂 UI。

“登堂入室”目标

  • 熟练管理生命周期,处理配置变化。
  • 实现多 Activity 间的数据传递和导航。
  • 集成复杂交互(如手势、异步任务)。
  • 优化性能,处理内存泄漏和滑动冲突。
  • 理解现代替代方案(如 ViewModelLiveData)。

2. 综合示例:高级 Activity 使用

以下是一个综合示例,展示多 Activity 导航、复杂手势、异步任务和状态管理,结合 DrawerLayoutViewPager2TextWatcherConfigurationAsyncTaskGestures。功能包括:

  • 主界面MainActivity):包含 ToolbarEditText(输入监听)、ImageView(手势处理)、ViewPager2(页面切换)、DrawerLayout(侧滑菜单)。
  • 第二界面SecondActivity):接收数据,显示结果,支持返回数据。
  • 手势:单击、双击、缩放、旋转(多点触碰)。
  • 异步任务:模拟网络请求,优化内存管理。
  • 状态管理:保存和恢复输入、手势状态。
  • 配置变化:响应屏幕旋转和语言切换。

2.1 布局文件res/layout/activity_main.xml

主界面布局。

2.2 第二 Activity 布局res/layout/activity_second.xml

接收和显示数据。

2.3 菜单资源res/menu/nav_menu.xml) 侧滑菜单。 2.4 字符串资源res/values/strings.xml) 支持多语言。 Activity 登堂入室 Open navigation drawer Close navigation drawer Home Profile Settings Enter text 中文资源res/values-zh/strings.xml):
Activity 登堂入室 打开导航抽屉 关闭导航抽屉 首页 个人中心 设置 请输入文本 2.5 Fragment 页面PageFragment.java) 用于 ViewPager2
package com.example.myapp; import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment; public class PageFragment extends Fragment {
private static final String ARG_PAGE = “page”;
private static final String ARG_RESULT = “result”;
private TextView textView; public static PageFragment newInstance(int page, String result) { PageFragment fragment = new PageFragment(); Bundle args = new Bundle(); args.putInt(ARG_PAGE, page); args.putString(ARG_RESULT, result); fragment.setArguments(args); return fragment; } @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(android.R.layout.simple_list_item_1, container, false); textView = view.findViewById(android.R.id.text1); updateContent(); return view; } public void updateResult(String result) { if (getArguments() != null) { getArguments().putString(ARG_RESULT, result); updateContent(); } } private void updateContent() { int page = getArguments() != null ? getArguments().getInt(ARG_PAGE) : 0; String result = getArguments() != null ? getArguments().getString(ARG_RESULT, "") : ""; textView.setText("页面 " + (page + 1) + "\n结果: " + (result.isEmpty() ? "无" : result)); } }
2.6 AsyncTask 子类NetworkTask.java) 优化异步任务,防止内存泄漏。
package com.example.myapp; import android.os.AsyncTask;
import android.widget.PopupWindow;
import android.widget.ProgressBar;
import android.widget.TextView;
import java.lang.ref.WeakReference; public class NetworkTask extends AsyncTask {
private final WeakReference activityRef;
private final WeakReference progressBarRef;
private final WeakReference resultTextRef; public NetworkTask(MainActivity activity, ProgressBar progressBar, TextView resultText) { activityRef = new WeakReference<>(activity); progressBarRef = new WeakReference<>(progressBar); resultTextRef = new WeakReference<>(resultText); } @Override protected void onPreExecute() { ProgressBar progressBar = progressBarRef.get(); if (progressBar != null) { progressBar.setVisibility(View.VISIBLE); } } @Override protected String doInBackground(String... params) { try { String input = params[0]; for (int i = 1; i <= 100; i += 10) { Thread.sleep(500); publishProgress(i); if (isCancelled()) { return null; } } return "任务完成: " + input; } catch (InterruptedException e) { return "错误: " + e.getMessage(); } } @Override protected void onProgressUpdate(Integer... values) { ProgressBar progressBar = progressBarRef.get(); if (progressBar != null) { progressBar.setProgress(values[0]); } } @Override protected void onPostExecute(String result) { ProgressBar progressBar = progressBarRef.get(); TextView resultText = resultTextRef.get(); MainActivity activity = activityRef.get(); if (progressBar != null && resultText != null && activity != null) { progressBar.setVisibility(View.GONE); resultText.setText(result != null ? result : "任务取消"); if (result != null) { PopupWindow popupWindow = new PopupWindow(new TextView(activity), 200, 100, true); ((TextView) popupWindow.getContentView()).setText(result); popupWindow.showAsDropDown(resultText); activity.updateViewPagerResult(result); } } } @Override protected void onCancelled() { ProgressBar progressBar = progressBarRef.get(); TextView resultText = resultTextRef.get(); MainActivity activity = activityRef.get(); if (progressBar != null && resultText != null && activity != null) { progressBar.setVisibility(View.GONE); resultText.setText("任务取消"); PopupWindow popupWindow = new PopupWindow(new TextView(activity), 200, 100, true); ((TextView) popupWindow.getContentView()).setText("任务取消"); popupWindow.showAsDropDown(resultText); } } }
2.7 第二 Activity 代码SecondActivity.java) 接收数据并返回结果。
package com.example.myapp; import android.content.Intent;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity; public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second); TextView resultText = findViewById(R.id.resultText); String data = getIntent().getStringExtra("data"); resultText.setText("收到: " + (data != null ? data : "无")); Button returnButton = findViewById(R.id.returnButton); returnButton.setOnClickListener(v -> { Intent resultIntent = new Intent(); resultIntent.putExtra("result", "从 SecondActivity 返回: " + System.currentTimeMillis()); setResult(RESULT_OK, resultIntent); finish(); }); if (savedInstanceState != null) { resultText.setText(savedInstanceState.getString("resultText", "收到: 无")); } } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); TextView resultText = findViewById(R.id.resultText); outState.putString("resultText", resultText.getText().toString()); } }
2.8 AndroidManifest.xml 声明两个 Activity。 2.9 主 Activity 代码MainActivity.java) 综合示例,包含多 Activity 导航、手势、异步任务等。
package com.example.myapp; import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.Matrix;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.PopupWindow;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBarDrawerToggle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.view.GestureDetectorCompat;
import androidx.core.view.GravityCompat;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.fragment.app.Fragment;
import androidx.viewpager2.adapter.FragmentStateAdapter;
import androidx.viewpager2.widget.ViewPager2;
import com.google.android.material.navigation.NavigationView;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale; public class MainActivity extends AppCompatActivity {
private DrawerLayout drawerLayout;
private ViewPager2 viewPager;
private EditText inputEditText;
private TextView resultText;
private ProgressBar progressBar;
private ImageView gestureImage;
private TextWatcher textWatcher;
private ViewPagerAdapter viewPagerAdapter;
private GestureDetectorCompat gestureDetector;
private ScaleGestureDetector scaleDetector;
private NetworkTask asyncTask;
private Handler handler;
private float scale = 1.0f;
private float rotation = 0.0f;
private float lastAngle;
private Matrix matrix = new Matrix();
private ActivityResultLauncher launcher; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toast.makeText(this, "onCreate", Toast.LENGTH_SHORT).show(); // 初始化 Toolbar Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); // 初始化 DrawerLayout drawerLayout = findViewById(R.id.drawerLayout); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( this, drawerLayout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); drawerLayout.addDrawerListener(toggle); toggle.syncState(); // 侧滑菜单 NavigationView navigationView = findViewById(R.id.navigationView); navigationView.setNavigationItemSelectedListener(item -> { int itemId = item.getItemId(); if (itemId == R.id.nav_home) { viewPager.setCurrentItem(0); Toast.makeText(this, "首页", Toast.LENGTH_SHORT).show(); } else if (itemId == R.id.nav_profile) { Intent intent = new Intent(this, SecondActivity.class); intent.putExtra("data", inputEditText.getText().toString()); launcher.launch(intent); } else if (itemId == R.id.nav_settings) { String input = inputEditText.getText().toString(); if (asyncTask != null && asyncTask.getStatus() == AsyncTask.Status.RUNNING) { asyncTask.cancel(true); } else { asyncTask = new NetworkTask(this, progressBar, resultText); asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, input.isEmpty() ? "默认任务" : input); } } drawerLayout.closeDrawers(); return true; }); // 初始化 ViewPager2 viewPager = findViewById(R.id.viewPager); viewPagerAdapter = new ViewPagerAdapter(this); viewPager.setAdapter(viewPagerAdapter); // 初始化 UI 组件 inputEditText = findViewById(R.id.inputEditText); resultText = findViewById(R.id.resultText); progressBar = findViewById(R.id.progressBar); gestureImage = findViewById(R.id.gestureImage); handler = new Handler(Looper.getMainLooper()); // 初始化 ActivityResultLauncher launcher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == RESULT_OK && result.getData() != null) { String returnedData = result.getData().getStringExtra("result"); resultText.setText(returnedData); viewPagerAdapter.updateResult(returnedData); } }); // 初始化 TextWatcher textWatcher = new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {} @Override public void onTextChanged(CharSequence s, int start, int before, int count) {} @Override public void afterTextChanged(Editable s) { String input = s.toString(); if (input.equalsIgnoreCase("english")) { setLocale(new Locale("en")); } else if (input.equalsIgnoreCase("chinese")) { setLocale(new Locale("zh")); } else if (input.equalsIgnoreCase("reset")) { scale = 1.0f; rotation = 0.0f; matrix.reset(); matrix.postScale(scale, scale); matrix.postRotate(rotation); gestureImage.setImageMatrix(matrix); resultText.setText("结果: 重置"); viewPagerAdapter.updateResult("重置"); } } }; inputEditText.addTextChangedListener(textWatcher); // 初始化手势 gestureDetector = new GestureDetectorCompat(this, new GestureDetector.SimpleOnGestureListener() { @Override public boolean onSingleTapUp(MotionEvent e) { handler.post(() -> { resultText.setText("手势: 单击"); viewPagerAdapter.updateResult("单击"); PopupWindow popupWindow = new PopupWindow(new TextView(MainActivity.this), 200, 100, true); ((TextView) popupWindow.getContentView()).setText("单击触发"); popupWindow.showAsDropDown(gestureImage); }); return true; } @Override public boolean onDoubleTap(MotionEvent e) { resultText.setText("手势: 双击"); viewPagerAdapter.updateResult("双击"); handler.postDelayed(() -> { new AlertDialog.Builder(MainActivity.this) .setTitle("双击") .setMessage("触发双击手势") .setPositiveButton("确定", null) .show(); }, 200); return true; } }); scaleDetector = new ScaleGestureDetector(this, new ScaleGestureDetector.SimpleOnScaleGestureListener() { @Override public boolean onScale(ScaleGestureDetector detector) { scale *= detector.getScaleFactor(); scale = Math.max(0.5f, Math.min(scale, 2.0f)); matrix.reset(); matrix.postScale(scale, scale); matrix.postRotate(rotation); gestureImage.setImageMatrix(matrix); resultText.setText("手势: 缩放 (比例: " + String.format("%.2f", scale) + ")"); viewPagerAdapter.updateResult("缩放 (比例: " + String.format("%.2f", scale) + ")"); return true; } }); gestureImage.setOnTouchListener((v, event) -> { viewPager.requestDisallowInterceptTouchEvent(true); gestureDetector.onTouchEvent(event); scaleDetector.onTouchEvent(event); switch (event.getActionMasked()) { case MotionEvent.ACTION_POINTER_DOWN: if (event.getPointerCount() == 2) { lastAngle = getAngle(event); } break; case MotionEvent.ACTION_MOVE: if (event.getPointerCount() == 2) { float newAngle = getAngle(event); if (lastAngle != 0) { rotation += newAngle - lastAngle; matrix.reset(); matrix.postScale(scale, scale); matrix.postRotate(rotation); gestureImage.setImageMatrix(matrix); resultText.setText("手势: 旋转 (" + String.format("%.2f", rotation) + "°)"); viewPagerAdapter.updateResult("旋转 (" + String.format("%.2f", rotation) + "°)"); } lastAngle = newAngle; } break; case MotionEvent.ACTION_POINTER_UP: case MotionEvent.ACTION_UP: lastAngle = 0; break; } return true; }); // 恢复状态 if (savedInstanceState != null) { scale = savedInstanceState.getFloat("scale", 1.0f); rotation = savedInstanceState.getFloat("rotation", 0.0f); matrix.reset(); matrix.postScale(scale, scale); matrix.postRotate(rotation); gestureImage.setImageMatrix(matrix); String savedInput = savedInstanceState.getString("input", ""); inputEditText.setText(savedInput); String savedResult = savedInstanceState.getString("result", "结果"); resultText.setText(savedResult); viewPagerAdapter.updateResult(savedResult); } } private float getAngle(MotionEvent event) { float dx = event.getX(0) - event.getX(1); float dy = event.getY(0) - event.getY(1); return (float) Math.toDegrees(Math.atan2(dy, dx)); } @Override protected void onStart() { super.onStart(); Toast.makeText(this, "onStart", Toast.LENGTH_SHORT).show(); } @Override protected void onResume() { super.onResume(); Toast.makeText(this, "onResume", Toast.LENGTH_SHORT).show(); } @Override protected void onPause() { super.onPause(); Toast.makeText(this, "onPause", Toast.LENGTH_SHORT).show(); } @Override protected void onStop() { super.onStop(); Toast.makeText(this, "onStop", Toast.LENGTH_SHORT).show(); } @Override protected void onDestroy() { super.onDestroy(); Toast.makeText(this, "onDestroy", Toast.LENGTH_SHORT).show(); inputEditText.removeTextChangedListener(textWatcher); if (asyncTask != null) { asyncTask.cancel(true); } handler.removeCallbacksAndMessages(null); } @Override protected void onRestart() { super.onRestart(); Toast.makeText(this, "onRestart", Toast.LENGTH_SHORT).show(); } @Override public void onConfigurationChanged(@NonNull Configuration newConfig) { super.onConfigurationChanged(newConfig); resultText.setText("配置: " + (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT ? "竖屏" : "横屏")); viewPagerAdapter.updateResult(resultText.getText().toString()); Toast.makeText(this, "配置变化", Toast.LENGTH_SHORT).show(); } @Override protected void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); outState.putFloat("scale", scale); outState.putFloat("rotation", rotation); outState.putString("input", inputEditText.getText().toString()); outState.putString("result", resultText.getText().toString()); } @Override public void onBackPressed() { if (drawerLayout.isDrawerOpen(GravityCompat.START)) { drawerLayout.closeDrawer(GravityCompat.START); } else { super.onBackPressed(); } } public void updateViewPagerResult(String result) { viewPagerAdapter.updateResult(result); } private void setLocale(Locale locale) { Locale.setDefault(locale); Configuration config = new Configuration(); config.setLocale(locale); getResources().updateConfiguration(config, getResources().getDisplayMetrics()); recreate(); } private static class ViewPagerAdapter extends FragmentStateAdapter { private final List<PageFragment> fragments = new ArrayList<>(); private String result = ""; public ViewPagerAdapter(AppCompatActivity activity) { super(activity); for (int i = 0; i < 3; i++) { fragments.add(PageFragment.newInstance(i, result)); } } public void updateResult(String result) { this.result = result; for (PageFragment fragment : fragments) { fragment.updateResult(result); } notifyDataSetChanged(); } @NonNull @Override public Fragment createFragment(int position) { return fragments.get(position); } @Override public int getItemCount() { return 3; } } }
2.10 运行效果 生命周期:每个阶段(onCreateonStart 等)显示 Toast,方便调试。 界面:包含 ToolbarEditText(输入监听)、ImageView(手势处理)、ProgressBar(任务进度)、TextView(结果)、ViewPager2(3 个页面)。 手势单击:显示 PopupWindow,更新 TextViewViewPager2双击:延迟显示 AlertDialog,更新 UI。 缩放:调整 ImageView 大小,更新 UI。 旋转:双指旋转 ImageView,更新 UI。 TextWatcher: 输入“english”/“chinese”切换语言。 输入“reset”重置缩放和旋转。 AsyncTask: 侧滑菜单“Settings”触发/取消异步任务(并行执行)。 显示 ProgressBar,任务完成后显示 PopupWindow多 Activity 导航: 侧滑菜单“Profile”跳转到 SecondActivity,传递输入数据。 SecondActivity 返回数据,更新 TextViewViewPager2Configuration: 屏幕旋转时更新 UI,保持手势状态。 状态保存: 保存输入、缩放、旋转和结果,屏幕旋转或进程恢复后还原。 说明生命周期:通过 Toast 展示,便于学习。 手势:使用 Matrix 实现缩放和旋转,结合 GestureDetectorCompatScaleGestureDetectorAsyncTask:使用 WeakReference 和并行执行优化。 导航:使用 ActivityResultLauncher 实现现代化数据返回。 状态管理:保存复杂状态(缩放、旋转)。 3. 高级功能示例 以下是“登堂入室”阶段的进阶功能。 3.1 复杂手势:多点触碰拖动 支持拖动 ImageViewprivate float lastX, lastY; gestureImage.setOnTouchListener((v, event) -> { viewPager.requestDisallowInterceptTouchEvent(true); gestureDetector.onTouchEvent(event); scaleDetector.onTouchEvent(event); switch (event.getActionMasked()) { case MotionEvent.ACTION_DOWN: lastX = event.getX(); lastY = event.getY(); break; case MotionEvent.ACTION_MOVE: if (event.getPointerCount() == 1) { float dx = event.getX() - lastX; float dy = event.getY() - lastY; matrix.postTranslate(dx, dy); gestureImage.setImageMatrix(matrix); resultText.setText("手势: 拖动 (" + dx + ", " + dy + ")"); viewPagerAdapter.updateResult("拖动 (" + dx + ", " + dy + ")"); lastX = event.getX(); lastY = event.getY(); } break; } return true; }); 3.2 进程恢复 处理进程被杀死后恢复。 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (savedInstanceState != null) { // 恢复复杂状态 String savedResult = savedInstanceState.getString("result", "结果"); resultText.setText(savedResult); viewPagerAdapter.updateResult(savedResult); } } 3.3 异步任务优化 使用 ExecutorService 替代 AsyncTask(因 AsyncTask 在 API 30+ 弃用)。 ExecutorService executor = Executors.newSingleThreadExecutor(); Handler handler = new Handler(Looper.getMainLooper()); public void startAsyncTask(String input) { executor.execute(() -> { try { for (int i = 1; i <= 100; i += 10) { Thread.sleep(500); int progress = i; handler.post(() -> progressBar.setProgress(progress)); } String result = "任务完成: " + input; handler.post(() -> { progressBar.setVisibility(View.GONE); resultText.setText(result); viewPagerAdapter.updateResult(result); }); } catch (InterruptedException e) { handler.post(() -> resultText.setText("错误: " + e.getMessage())); } }); } 4. 优化建议 生命周期管理: 初始化在 onCreate,清理在 onDestroy
java @Override protected void onDestroy() { handler.removeCallbacksAndMessages(null); executor.shutdown(); super.onDestroy(); } 状态保存: 保存复杂状态:
java @Override protected void onSaveInstanceState(@NonNull Bundle outState) { outState.putFloat("scale", scale); outState.putFloat("rotation", rotation); super.onSaveInstanceState(outState); } 滑动冲突: 动态控制拦截:
java viewPager.setUserInputEnabled(false); // 禁用 ViewPager2 滑动 内存泄漏: 使用 WeakReference
java private final WeakReference<TextView> resultTextRef = new WeakReference<>(resultText); 性能优化: 防抖手势处理:
java long lastUpdateTime; @Override public boolean onScale(ScaleGestureDetector detector) { long currentTime = System.currentTimeMillis(); if (currentTime - lastUpdateTime > 100) { scale *= detector.getScaleFactor(); lastUpdateTime = currentTime; } return true; } 现代替代方案: 使用 ViewModelLiveData
java public class MainViewModel extends ViewModel { private MutableLiveData<String> result = new MutableLiveData<>(); public LiveData<String> getResult() { return result; } public void setResult(String value) { result.setValue(value); } } 5. 常见问题及解决 Activity 重启丢失数据解决:保存状态或使用 ViewModel滑动冲突解决:使用 requestDisallowInterceptTouchEvent内存泄漏解决:清理 AsyncTask 和监听器。 异步任务卡顿解决:使用并行执行或 ExecutorService手势不准确解决:校准触点 ID 或使用防抖。 6. 结合之前组件 AlertDialog:双击触发。 PopupWindow:单击或异步任务完成触发。 Menu:侧滑菜单导航。 ViewPager2:显示结果。 DrawerLayout:触发任务或跳转。 TextWatcher:语言切换和重置。 Configuration:屏幕旋转处理。 AsyncTask:并行执行网络任务。 Gestures:支持缩放、旋转、拖动。 Handler:延迟处理手势。 OnTouchListener:处理多点触碰。 7. 可能的其他意图 复杂 UI:如需 RecyclerView、复杂布局,请说明。 数据可视化:如需手势或任务结果图表,请提供数据。 跨平台:如需 Web 或 iOS 方案,请说明。 问题调试:如有崩溃、性能问题,请描述。 下一步 请提供更多细节,例如: 你想深入的 Activity 功能(导航、复杂交互、性能优化)? 是否需要特定组件(如 RecyclerViewBottomSheetDialog)? 是否有具体问题(生命周期、内存泄漏)? 需要更复杂示例(如多 Activity 复杂导航)? 如果没有进一步信息,我可以提供更高级的 Activity 示例(如结合 ViewModelLiveData)或详细的性能优化指南。

文章已创建 2371

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部