Android--第一个android程序

 写在前边

※安卓开发工具常用模拟器汇总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组合键,这将直接打开任务管理器。或者,你也可以通过右键点击任务栏,然后选择“任务管理器”来打开它。

  1. 查找Android模拟器进程:在任务管理器中,切换到“进程”选项卡(在Windows 10及更高版本中,这通常是默认显示的选项卡);滚动进程列表,查找与Android模拟器相关的进程。这些进程可能包含“emulator”、“qemu”、“adb”(Android Debug Bridge)或“studio64.exe”(如果Android Studio正在运行64位版本)等字样。※注意,进程名称可能会因Android Studio的版本或安装的模拟器而有所不同。
  2. 结束进程:如果你找到了与Android模拟器相关的进程,并且确定它是不再需要的,你可以右键点击该进程,然后选择“结束任务”来关闭它。※警告:结束某些进程可能会导致数据丢失或系统不稳定。特别是与Android模拟器相关的进程,结束它们可能会导致正在运行的模拟器实例关闭,并可能丢失未保存的模拟器状态或数据。因此,在结束进程之前,请确保你了解该进程的作用,并谨慎操作。
  3. 重启Android Studio或模拟器:有时候,结束与模拟器相关的进程后,你可能需要重启Android Studio或模拟器来恢复正常的操作。
上一篇:Vue 3 中的状态管理:深入探讨 Vuex 和 Pinia 的比较与最佳实践