写在前边
※安卓开发工具常用模拟器汇总Android开发者必备工具-常见Android模拟器(MuMu、夜神、蓝叠、逍遥、雷电、Genymotion...)_安卓模拟器-****博客
※一般游戏模拟器运行速度相对较快,本文选择逍遥模拟器_以下是Android Studio连接模拟器实现(先从以上博文中下载逍遥模拟器)
Android studio连接逍遥安卓模拟器_逍遥模拟器怎么连接android studio-****博客
新建工程exp1
新建项目--Empty Activity(选择java语言),工程目录如下:
项目创建完成,逍遥模拟器下载后,Android Studio连接模拟器Asus ASUS_I005DA;
运行app后显示如下:
MainActivity.java文件
它是应用程序的主要活动(Activity),负责处理用户与应用程序之间的交互。 它包含了应用程序的主要逻辑和界面设计,主要是实现功能设计;
MainActivity类继承了AppCompatActivity类;并重写override其中的函数onCreate函数;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_main);
//MainActivity.java和activity_main.xml如何建立联系:
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right,
systemBars.bottom);
return insets;
});
}
activity_main.xml文件
activity_main.xml其实就是一个布局文件;手动拖动的控件系统可以帮忙自动生成xml代码,该文件有code、split、design三个界面;我们大多通过code进行页面设计;
【以下测试使用模拟器Medium Phone API 35】
a.程序正常启动和关闭
程序运行:
程序结束:
(1)程序开始运行时经过了三个状态,分别为onCreate(), onStart(),onResume()
onCreate: Activity启动以后第一个被调用的函数,用来进行初始化。
onStart(): Activity显示到屏幕上时会被调用。
onResume(): Activity可以接受用户的输入时,会被调用,处于Activity栈的栈顶。
(2)程序关闭时【在overview界面清除程序后台】经过了四个状态,分别为onPause(),onStop(),on SaveInstanceState()和onDestroy()
onPause(): Activity进入暂停状态时被调用。
onStop(): Activity不对用户可见以后,就会被调用,Activity进入停止状态。
on SaveInstanceState():保存Acticivity被销毁前的状态:在离开页面的时候用onSaveInstanceState中的outState可以保存你所需要的值;
onDestory: Activity被终止前,或者说进入非活动状态时,会被调用。
b.电话_程序运行与中断
程序运行:
切换打电话页面:
重新切换回程序页面:
(1)程序开始运行时经过了三个状态,分别为onCreate(), onStart(),onResume():
onCreate: Activity启动以后第一个被调用的函数,用来进行初始化。
onStart(): Activity显示到屏幕上时会被调用。
onResume(): Activity可以接受用户的输入时,会被调用,处于Activity栈的栈顶。
(2)程序打电话时经过了三个状态,分别为onPause(),onStop(),on SaveInstanceState():
onPause(): onPause(): Activity进入暂停状态时被调用。
onStop(): Activity不对用户可见以后,就会被调用,Activity进入停止状态。
切换界面打电话,导致原有程序进入不可见的状态,所以先执行onPause在执行onStop()回调函数。
on SaveInstanceState():保存Acticivity被销毁前的状态:在离开页面的时候用onSaveInstanceState中的outState可以保存你所需要的值;
(3)程序在电话挂断的时候经过了三个状态,分别为onRestart(),onStart(),onResume():
onRestart(): Activity从停止状态进入活动状态。
onStart(): Activity显示到屏幕上时会被调用。
onResume(): Activity可以接受用户的输入时,会被调用,处于Activity栈的栈顶。
电话挂断以后,重新进入原程序界面,所以会经历重启,接受用户输入的过程。
c.短信_程序运行与中断
程序运行:
短信发送页面:
重新切回程序:
(1)程序开始运行时经过了三个状态,分别为onCreate(), onStart(),onResume():
onCreate: Activity启动以后第一个被调用的函数,用来进行初始化。
onStart(): Activity显示到屏幕上时会被调用。
onResume(): Activity可以接受用户的输入时,会被调用,处于Activity栈的栈顶。
(2)程序发送短信经过了三个状态,分别为onPause(),onStop(),on SaveInstanceState():
onPause(): onPause(): Activity进入暂停状态时被调用。
onStop(): Activity不对用户可见以后,就会被调用,Activity进入停止状态。
切换界面发短信,导致原有程序进入不可见的状态,所以先执行onPause在执行onStop()回调函数。
on SaveInstanceState():保存Acticivity被销毁前的状态:在离开页面的时候用onSaveInstanceState中的outState可以保存你所需要的值;
(3)程序在短信界面切回的时候经过了三个状态,分别为onRestart(),onStart(),onResume():
onRestart(): Activity从停止状态进入活动状态。
onStart(): Activity显示到屏幕上时会被调用。
onResume(): Activity可以接受用户的输入时,会被调用,处于Activity栈的栈顶。
//Mainactivity.java
package com.example.exp1;
import android.content.Intent;
import android.content.IntentSender;
import android.os.Bundle;
import androidx.activity.EdgeToEdge;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.fragment.app.Fragment;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
private static String TAG="LIFTCYCLE";
@Override //重写onCreate函数,完全生命周期的开始,用来进行activity初始化
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//EdgeToEdge.enable(this);
setContentView(R.layout.activity_main);
Log.i(TAG,"(1)onCreate()");
}
//可视生命周期的开始,activity显示在屏幕上调用;
@Override
public void onStart(){
super.onStart();
Log.i(TAG,"(2)onStart()");
}
@Override
//恢复onsaveInstanceState()保护的用户界面信息
public void onRestoreInstanceState(Bundle savedInstanceState){
super.onRestoreInstanceState(savedInstanceState);
Log.i(TAG,"(3)onRestoreInstanceState()");
}
@Override
//活动生命周期开始时被调用,恢复被onPause()停止的用于UI更新的资源
public void onResume(){
super.onResume();
Log.i(TAG,"(4)onResume()");
}
@Override
//在onResume()后被掉用,保存界面信息
public void onSaveInstanceState(Bundle savedInstaceState){
super.onSaveInstanceState(savedInstaceState);
Log.i(TAG,"(5)onSaveInstanceState()");
}
@Override
//在重新进入可视生命周期前调用
public void onRestart(){
super.onRestart();
Log.i(TAG,"(6)onRestart()");
}
@Override
//在活动生命周期结束时调用;
public void onPause(){
super.onPause();
Log.i(TAG,"(7)onPause()");
}
@Override
//在可视生命周期时调用
public void onStop(){
super.onStop();
Log.i(TAG,"(8)onStop()");
}
@Override
//在完全生命周期结束时调用
public void onDestroy(){
super.onDestroy();
Log.i(TAG,"(9)onDestroy()");
}
}
//abdroidmanifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" >
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Exp1"
tools:targetApi="31" >
<activity
android:name=".MainActivity"
android:exported="true" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
//activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="这是第一个Android程序"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
问题:
Medium Phone API 35 is already running. If that is not the case, delete C:\Users\DELL\.android\avd\Medium_Phone_API_35.avd\*.lock and try again.
打开任务管理器:按下键盘上的Ctrl+Shift+Esc组合键,这将直接打开任务管理器。或者,你也可以通过右键点击任务栏,然后选择“任务管理器”来打开它。
- 查找Android模拟器进程:在任务管理器中,切换到“进程”选项卡(在Windows 10及更高版本中,这通常是默认显示的选项卡);滚动进程列表,查找与Android模拟器相关的进程。这些进程可能包含“emulator”、“qemu”、“adb”(Android Debug Bridge)或“studio64.exe”(如果Android Studio正在运行64位版本)等字样。※注意,进程名称可能会因Android Studio的版本或安装的模拟器而有所不同。
- 结束进程:如果你找到了与Android模拟器相关的进程,并且确定它是不再需要的,你可以右键点击该进程,然后选择“结束任务”来关闭它。※警告:结束某些进程可能会导致数据丢失或系统不稳定。特别是与Android模拟器相关的进程,结束它们可能会导致正在运行的模拟器实例关闭,并可能丢失未保存的模拟器状态或数据。因此,在结束进程之前,请确保你了解该进程的作用,并谨慎操作。
- 重启Android Studio或模拟器:有时候,结束与模拟器相关的进程后,你可能需要重启Android Studio或模拟器来恢复正常的操作。