热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

AndroidstudioActivity

Activity使用什么是ActivityActivity是一个Android的应用组件,它提供屏幕进行交互。每个Activity都会获得一个用于绘制其用户界面的


Activity使用


什么是Activity

Activity是一个Android的应用组件,它提供屏幕进行交互。每个Activity都会获得一个用于绘制其用户界面的窗口,窗口可以充满哦屏幕也可以小于屏幕并浮动在其他窗口之上。

一个应用通常是由多个彼此松散联系的Activity组成,一般会指定应用中的某个Activity为主活动,也就是说首次启动应用时给用户呈现的Activity。

将Activity设为主活动的方法,如下面代码所示需要在AndroidManifest文件中添加以下内容


     ....






        ....

在 android 中,Activity 拥有四种基本状态:

1.Active/Runing 一个新 Activity 启动入栈后,它在屏幕最前端,处于栈的最顶端,此时它处于可见并可和用户交互的激活状态。

2.Paused 当 Activity 被另一个透明或者 Dialog 样式的 Activity 覆盖时的状态。此时它依然与窗口管理器保持连接,系统继续维护其内部状态,所以它仍然可见,但它已经失去了焦点故不可与用户交互。

3.Stoped 当 Activity 被另外一个 Activity 覆盖、失去焦点并不可见时处于 Stop ed 状态。

4.Killed Activity 被系统杀死回收或者没有被启动时处于 Killed 状态。

如果一个活动在处于停止或者暂停的状态下,系统内存缺乏时会将其结束(finish)或者杀死(kill)。这种非正常情况下,系统在杀死或者结束之前会调用onSaveInstance()方法来保存信息,同时,当Activity被移动到前台时,重新启动该Activity并调用onRestoreInstance()方法加载保留的信息,以保持原有的状态。

当一个 Activity 实例被创建、销毁或者启动另外一个 Activity 时,它在这四种状态之间进行转换,这种转换的发生依赖于用户程序的动作。下图说明了 Activity 在不同状态间转换的时机和条件:

 

 


生命周期

在上面的四中常有的状态之间,还有着其他的生命周期来作为不同状态之间的过度,用于在不同的状态之间进行转换,生命周期的具体说明见下


函数

是否可终止

说明

onCreate()

Activity启动后第一个被调用的函数,常用来进行Activity的初始化,例如创建View、绑定数据或恢复信息等。

onStart()

当Activity显示在屏幕上时,该函数被调用。

onRestart()

当Activity从停止状态进入活动状态前,调用该函数。

onResume()

当Activity可以接受用户输入时,该函数被调用。

onPause()

当Activity进入暂停状态时,该函数被调用。主要用来保存持久数据、关闭动画、释放CPU资源等。该函数中的代码必须简短,因为另一个Activity必须等待该函数执行完毕后才能显示在界面上。

onStop()

当Activity不对用户可见后,该函数被调用,Activity进入停止状态。

onDestroy()

在Activity被终止前,即进入非活动状态前,该函数被调用。有两种情况该函数会被调用:(1)当程序主动调用finish()函数;(2)程序被Android系统终结。


  1. Activity 的整个生命周期发生在 onCreate() 调用与 onDestroy() 调用之间。您的 Activity 应在 onCreate()中执行“全局”状态设置(例如定义布局),并释放 onDestroy()中的所有其余资源。例如,如果您的 Activity 有一个在后台运行的线程,用于从网络上下载数据,它可能会在onCreate() 中创建该线程,然后在onDestroy() 中停止该线程。
  2. Activity 的可见生命周期发生在 onStart() 调用与 onStop() 调用之间。在这段时间,用户可以在屏幕上看到 Activity 并与其交互。例如,当一个新 Activity 启动,并且此 Activity 不再可见时,系统会调用onStop()。您可以在调用这两个方法之间保留向用户显示 Activity 所需的资源。例如,您可以在onStart() 中注册一个 BroadcastReceiver 以监控影响 UI的变化,并在用户无法再看到您显示的内容时在 onStop()中将其取消注册。在 Activity 的整个生命周期,当 Activity 在对用户可见和隐藏两种状态中交替变化时,系统可能会多次调用 onStart() 和 onStop()。
  3. Activity 的前台生命周期发生在 onResume() 调用与 onPause() 调用之间。在这段时间,Activity 位于屏幕上的所有其他 Activity 之前,并具有用户输入焦点。Activity 可频繁转入和转出前台 — 例如,当设备转入休眠状态或出现对话框时,系统会调用 onPause()。由于此状态可能经常发生转变,因此这两个方法中应采用适度轻量级的代码,以避免因转变速度慢而让用户等待。

调用演示:

创建项目,代码如下:

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Log.e("Activity----->>>","onCreate");}/*** Activity从后台重新回到前台时被调用*/@Overrideprotected void onRestart() {super.onRestart();Log.e("Activity----->>>","onRestart");}/***Activity创建或者从后台重新回到前台时被调用*/@Overrideprotected void onStart() {super.onStart();Log.e("Activity----->>>","onStart");}/***Activity创建或者从被覆盖、后台重新回到前台时被调用*/@Overrideprotected void onResume() {super.onResume();Log.e("Activity----->>>","onResume");}/***  Activity被覆盖到下面或者锁屏时被调用*/@Overrideprotected void onPause() {super.onPause();Log.e("Activity----->>>","onPause");}/***退出当前Activity或者跳转到新Activity时被调用*/@Overrideprotected void onStop() {super.onStop();Log.e("Activity----->>>","onStop");;}/***退出当前Activity时被调用,调用之后Activity就结束了*/@Overrideprotected void onDestroy() {super.onDestroy();Log.e("Activity----->>>","onDestroy");}}

运行项目,查看日志:

点回退按钮,结束程序

重新运行,模拟电话呼入,接听时,查看日志

接完电话,回到页面

 

点home键

 

切换回来

 

调用另一个Activity

 

回退

 

横竖屏切换时候Activity的生命周期。

1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次

2、设置Activity的android:cOnfigChanges=”orientation”时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次

3、设置Activity的android:cOnfigChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法


配置Activity

在manifest文件必须声明activity,为了它可以被系统访问。要声明activity,打开manifest文件,添加一个元素作为元素的子元素。

一条元素至少应该包含一个,否则任何Intent请求都不能和该匹配。如果Intent请求的Action和中个某一条匹配,那么该Intent就通过了这条的动作测试。

    android:label="AnotherActivity"
    android:theme="@style/AppTheme">





启动Activity

Intent intent=new Intent(MainActivity.this,AnotherActivity.class);startActivity(intent);

通过隐式启动activity


  1. Intent intent=Intent();
     intent.setAction(
    "com.li.another");
     startActivity(intent);

回退栈

启动系统的Activity

浏览网页


  • 打开浏览器,请问http://www.baidu.com
    Uri uri = Uri.parse("http://www.baidu.com");
            Intent it=
    new Intent(Intent.ACTION_VIEW,uri);
            startActivity(it);

调用发短信的程序
       Intent it = new Intent(Intent.ACTION_VIEW);
       it.putExtra("sms_body", "The SMS text");
       it.setType("vnd.android-dir/mms-sms");
       startActivity(it);

 发送短信
      Uri uri = Uri.parse("smsto:0800000123");
      Intent it = new Intent(Intent.ACTION_SENDTO, uri);
      it.putExtra("sms_body", "The SMS text");
      startActivity(it);


Activity之间传递参数

程序中可能有多个Activity,那么这些Activity是如何传递数据的呢?答案是使用Intent。

考虑有两个Activity的程序,一个是MainActivity,另一个是AnotherActivity。传递数据有两种情况:

MainActivity仅仅向AnotherActivity传递数据,但是不需要AnotherAcitivty向MainActivity回传数据

MainActivity不仅向AnotherActivity传递数据,还要求后者向前者回传数据。

使用Intent来帮助我们传递数据,Intent提供了多个方法来“携带”数据。

putExtras(Bundle data)

putExtra(String name,Xxx value) ,其中Xxx为类型

Intent也提供了相应的get方法来获得传递的数据。

Bundle getExtras()

Xxx getXxxExtra(String name),其中Xxx为类型

如在:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button button=(Button)findViewById(R.id.buttonTest);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
 Intent intent=new Intent(MainActivity.this,AnotherActivity.class);
            intent.putExtra("name","Zhangsan");
            intent.putExtra("age",20);
            startActivity(intent);

        }
    });
}

接收方:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_another);

 Intent intent=getIntent();
    String name=intent.getStringExtra("name");
    Integer age=intent.getIntExtra("age", 20);
    Toast.makeText(this,name+age,Toast.LENGTH_LONG).show();


}


回传数据

有的时候MainActivity不但需要向其它Activity传递数据,当其它Activity处理完数据后还需要将处理结果返回给MainActivity。这怎么办呢?尤其是如果MainActivity中有多个按钮,每个按钮请求一个Activity,如下图所示,MainActivity又是如何区分是哪个Activity返回的结果呢?

首先MainActivity启动其它Activity应该使用startActivityForResult()方法。

该方法包括两个参数,第一个参数是Intent类型,第二个参数是请求码requestCode。例如单击Button0按钮启动ActivityOne,请求码是0,单击Button1按钮时某些情况下启动启动ActivityOne,请求码是1,某些情况下启动ActivityTwo,请求码是2等等

其次MainActivity应该重写onActivityResult()方法,当其它Activity返回结果后,系统会自动回调该方法。onActivityResult有三个参数

void onActivityResult(int requestCode, int resultCode, Intent data)

最后在AnotherActivity中需要将结果码和数据等通过setResult方法设置

Intent intent=getIntent();
String name=intent.getStringExtra("name");
Integer age=intent.getIntExtra("age", 20);
intent.putExtra("result","姓名:"+name+" 年龄"+age);
setResult(0,intent);
finish();

MainActivity中的代码

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
    setContentView(R.layout.
activity_main);
    Button button=(Button)findViewById(R.id.
buttonTest);
    button.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
            Intent intent=
new Intent(MainActivity.this,AnotherActivity.class);
            intent.putExtra(
"name","Zhangsan");
            intent.putExtra(
"age",20);
            startActivityForResult(intent,
0);
        }
    });

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);

if(requestCode==0 && resultCode==0){
        String str=data.getStringExtra(
"result");
        Toast.makeText(
this,str,Toast.LENGTH_LONG).show();
    }

}

AnotherActivity中,需要回传数据的位置写入代码,如

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_another);

    Button button=(Button)findViewById(R.id.buttonReturn);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent=getIntent();
            String name=intent.getStringExtra("name");
            Integer age=intent.getIntExtra("age", 20);
            intent.putExtra("result","
姓名:"+name+" 年龄"+age);
            setResult(0,intent);
            finish();

        }
    });
}


任务栈

一个应用程序通常由多个activities组成,他们通常是松耦合关系。通常,一个应用程序中的activity被指定为"main"activity,当第一次启动应用程序的时候呈现给用户的那个activity。每一个activity然后可以启动另一个activity为了完成不同的动作。每一次一个activity启动,前一个activity就停止了,但是系统保留activity在一个栈上(“back stack”)。当一个新activity启动,它被推送到栈顶,取得用户焦点。Back Stack符合简单“后进先出”原则,所以,当用户完成当前activity然后点击back按钮,它被弹出栈(并且被摧毁),然后之前的activity恢复。

任务是指在执行特定作业时与用户交互的一系列 Activity。 这些 Activity 按照各自的打开顺序排列在堆栈(即返回栈)中。

任务是一个有机整体,当用户开始新任务或通过“主页”按钮转到主屏幕时,可以移动到“后台”。 尽管在后台时,该任务中的所有 Activity 全部停止,但是任务的返回栈仍旧不变,也就是说,当另一个任务发生时,该任务仅仅失去焦点而已。

 

启动模式(launchMode)在多个Activity跳转的过程中扮演着重要的角色,它可以决定是否生成新的Activity实例,是否重用已存在的Activity实例,是否和其他Activity实例公用一个task里。task是一个具有栈结构的对象,一个task可以管理多个Activity,启动一个应用,也就创建一个与之对应的task。

Activity一共有以下四种launchMode:

Standard默认选项

系统在启动 Activity 的任务中创建 Activity 的新实例并向其传送 Intent。Activity 可以多次实例化,而每个实例均可属于不同的任务,并且一个任务可以拥有多个实例。

singleTop

如果当前任务的顶部已存在 Activity 的一个实例,则系统会通过调用该实例的 onNewIntent() 方法向其传送 Intent,而不是创建 Activity 的新实例。Activity 可以多次实例化,而每个实例均可属于不同的任务,并且一个任务可以拥有多个实例(但前提是位于返回栈顶部的 Activity 并不是 Activity 的现有实例)。

singleTask

系统创建新任务并实例化位于新任务底部的 Activity。但是,如果该 Activity 的一个实例已存在于一个单独的任务中,则系统会通过调用现有实例的onNewIntent() 方法向其传送 Intent,而不是创建新实例。一次只能存在 Activity 的一个实例。

singleInstance

与 "singleTask" 相同,只是系统不会将任何其他 Activity 启动到包含实例的任务中。该 Activity 始终是其任务唯一仅有的成员;由此 Activity 启动的任何 Activity 均在单独的任务中打开。

定义TaskStackActivity和FirstActivity.

xml version="1.0"encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_task_stack"
android:layout_match_parent"
android:layout_match_parent"
android:orientation="vertical">
<
TextView
android:layout_match_parent"
android:layout_wrap_content"
android:text="我是主activity"/>
<
Button
android:id="@+id/button"
android:layout_wrap_content"
android:layout_wrap_content"
android:OnClick="onClick1"
android:text="打开主activity"/>
<
Button
android:id="@+id/button1"
android:layout_wrap_content"
android:layout_wrap_content"
android:OnClick="onClick2"
android:text="打开FirstActivity"/>
LinearLayout>

TaskStack

public  void onClick1(View view){
    Intent intent=
new Intent(TaskStack.this,TaskStack.class);
    startActivity(intent);

}

public  void onClick2(View view){
    Intent intent=
new Intent(TaskStack.this,FirstActivity.class);
    startActivity(intent);

}

FirstActivity

public  void onClick1(View view){
    Intent intent=
new Intent(FirstActivity.this,TaskStack.class);
    startActivity(intent);

}

public  void onClick2(View view){
    Intent intent=
new Intent(FirstActivity.this,FirstActivity.class);
    startActivity(intent);

}

启动应用程序,点击打开FirstActivity->打开主activity->打开FirstActivity.点击返回键,观察页面变化。分析任务栈的内容。

在androidManifest.xml中将FirstActivity的android:launchMode="singleTop“

启动应用程序,点击打开FirstActivity->打开主activity->打开FirstActivity.多点几次打开FirstActivity,点击返回键,观察页面变化。分析任务栈的内容

在androidManifest.xml中将FirstActivity的android:launchMode="singleTask“

启动应用程序,点击打开FirstActivity->打开主activity, 点击返回键,观察页面变化。分析任务栈的内容

在androidManifest.xml中将FirstActivity的android:launchMode="singleInstance“

启动应用程序,点击打开FirstActivity->打开FirstActivity->打开主activity, 点击返回键,观察页面变化。分析任务栈的内容

MainActivity.java

package com.example.stone;import android.annotation.SuppressLint;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {int []images = new int[]{R.drawable.hand_cut,R.drawable.hand_stone,R.drawable.hand_bu};ImageView image,person;Handler handler;TextView computer_win,player_win,peace,result2;boolean flag=false;int temp=0;int j=0;int w=0,p=0;int total2=0;TextView result,total;@SuppressLint("HandlerLeak")@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);image=findViewById(R.id.computer);person=findViewById(R.id.person);person=findViewById(R.id.person);result=findViewById(R.id.result);total=findViewById(R.id.total);result2=findViewById(R.id.result2);computer_win=findViewById(R.id.computer_win);player_win=findViewById(R.id.player_win);peace=findViewById(R.id.peace);handler= new Handler(){@Overridepublic void handleMessage(@NonNull Message msg) {super.handleMessage(msg);switch (msg.what){case 0x01:image.setImageDrawable(getResources().getDrawable(images[msg.arg1]));break;}}};}public void click(View view){switch (view.getId()){case R.id.start:flag=true;computer();break;case R.id.Restart:flag=true;j=0;w=0;p=0;computer_win.setText("计算机胜利次数:"+ j);player_win.setText("玩家胜利次数:"+ w);peace.setText("平局次数:"+ p);result2.setText("");break;case R.id.bu:flag=false;person.setImageDrawable(getResources().getDrawable(R.drawable.hand_bu));image.setImageDrawable(getResources().getDrawable(images[temp]));if(temp==0){result.setText("不好意思,您输了!");computer_win.setText("计算机胜利次数:"+ ++j);}else if(temp==1){result.setText("恭喜您,取得了胜利!");player_win.setText("玩家胜利次数:"+ ++w);}else {result.setText("平局!");peace.setText("平局次数:"+ ++p);}total2=j+w+p;if(total2==10){if(j>w)result2.setText("计算机胜!结果是:" + j+ ":"+w);else if(jw)result2.setText("计算机胜!结果是:" + j+ ":"+w);else if(jw)result2.setText("计算机胜!结果是:" + j+ ":"+w);else if(j// image.setImageDrawable(getResources().getDrawable(images[i]));Message message =handler.obtainMessage();message.what=0x01; //相当于消息的id,用来区别其他的消息message.arg1=i;message.sendToTarget();//发送消息i++;if(i==images.length)i=0;try {sleep(500);} catch (InterruptedException e) {e.printStackTrace();}}}}.start();}
}

xml文件



 

 

 

 

 


推荐阅读
author-avatar
海滨2502940147
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有