Lurenwei's Blog


  • 首页

  • 归档

  • 分类

  • 标签

  • 关于

Ant风格的URL

发表于 2018-05-23 | 分类于 Java

Ant风格资源地址支持的3种匹配符

  • 符号?:匹配文件中的一个字符
  • 符号*:匹配文件中的任意字符
  • 符号**:匹配多层路径

@RequestMapping支持Ant风格的URL

  • /demo/*/new 可以匹配/demo/abc/new、/demo/aaa/new等URL
  • /demo/**/new 可以匹配/demo/new、/demo/abc/abc/new等URL
  • /demo/new?? 可以匹配/demo/newab等URL

安卓四大组件之Activity的生命周期

发表于 2018-01-29 | 分类于 Android

Activity的生命周期

一. 返回栈介绍

       在Android中,一个应用可能包含了多个Activity,这些Activity是可以层叠的,当启动一个新的活动,这个新活动会覆盖在原活动之上,然后我们点击Back键或者调用finish()方法会摧毁最上面的活动,下面的一个活动就会重新显示出来。
       可以看出这和栈很相似,没错这就是栈。栈是一种后进先出的数据结构,在安卓中我们称之为返回栈(Back Stack),在默认情况下,当我们启动一个新的活动,它会在返回栈中入栈,并出去栈顶的位置。当我们点击Back键或者调用用finish()方法会摧毁一个Activity时,栈顶的活动就会出栈,此时前一个入栈的活动就会处于栈顶的位置,再次呈现给了用户。

二. 四种活动状态

  1. 运行状态:活动处于返回栈栈顶时,这是活动处于运行状态。
  2. 暂停状态:当一个活动不再处于栈顶的位置,但仍然可见时,这个活动就进入了暂停状态。并不是所有的活动都会占满整个屏幕,比如一个对话框活动只会占用屏幕中间及部分区域,此时处于对话框下面的的活动处于暂停状态,处于暂停状态的活动依然完全存活着。
  3. 停止状态:当一个活动不再处于栈顶位置,并且完全不可见的时候,该活动就进入了停止状态
  4. 摧毁状态:当一个活动从返回栈栈顶移除后该活动就处于销毁状态。

三. Activity生命周期的7个回调方法

  1. onCreate(): 在活动第一次被创建的时候调用,完成活动的初始化。
  2. onStart(): 这个方法在活动由不可见变为可见的时候调用。
  3. onResume(): 这个方法在活动准备好喝用户进行交互的时候调用。此时活动一定处于栈顶。
  4. onPause(): 这个方法在系统准备去启动或者恢复另一个活动的时候多用,通常会在改方法中释放掉一些消耗CPU的资源,以及保存一些关键数据。
  5. onStop(): 这个方法在活动完全不可见的时候调用。
  6. onDestroy(): 这个方法在活动被销毁之前调用。
  7. onRestart(): 这个活动由停止状态变为运行状态之前调用。

下面是一张完整的活动生命周期示意图:

  1. 完整生存期:onCreate()->onDestroy()方法之间所经历的,就是整个完整生存期。在onCreate()中完成各种初始化操作,onDestroy()方法中完成释放内存的操作。
  2. 可见生存期:onStart()->onStop()方法之间所经历的,就是可见生存期。onStart()方法中对资源进行加载,而在onStop()中对资源进行释放。
  3. 前台生存期:onResume()->onPause()方法之间所经历的,就是前台生存期。此时活动总是处于运行状态,。

四. 生命周期活动Demo

1. MainAcitvity代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package com.example.lifecycledemo;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

public static String TAG="MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button normal_btn=(Button)findViewById(R.id.Normal);
Button dialog_btn=(Button)findViewById(R.id.Dialog);
normal_btn.setOnClickListener(new btn_event());
dialog_btn.setOnClickListener(new btn_event());
Log.d(TAG,"onCreate()");


}

@Override
protected void onStart() {
super.onStart();
Log.d(TAG,"onStart()");
}

@Override
protected void onResume() {
super.onResume();
Log.d(TAG,"onResume()");
}

@Override
protected void onPause() {
super.onPause();
Log.d(TAG,"onPause()");

}

@Override
protected void onStop() {
super.onStop();
Log.d(TAG,"onStop()");
}

@Override
protected void onRestart() {
super.onRestart();
Log.d(TAG,"onRestart()");
}

@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG,"onDestory()");
}

public class btn_event implements View.OnClickListener{
@Override
public void onClick(View view) {
switch (view.getId())
{
case R.id.Normal:
Intent intent1=new Intent(MainActivity.this,SecondActivity.class);
Log.d(TAG,"Click the button Go to normal activity");
startActivity(intent1);
break;
case R.id.Dialog:
Intent intent2=new Intent(MainActivity.this,ThirdActivity.class);
Log.d(TAG,"Click the button Go to dialog activity");
startActivity(intent2);
break;
default:
}
}
}

}


2. AndroidManifest.xml代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.lifecycledemo">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".SecondActivity">
</activity>
<activity android:name=".ThirdActivity"
android:theme="@style/Theme.AppCompat.Dialog">
</activity>
</application>
</manifest>

3. 输出结果

  1. 红色部分:启动App,MainActivity处于栈顶位置,对用户可见。
  2. 紫色部分:点击跳转到一个一般的活动,这时候一般活动会完全覆盖住MainActivity,处于栈顶位置,此时MainActivity处于停止状态。
  3. 蓝色部分:按下返回键(Back),从NormalActivity跳转回MainActivity,此时摧毁NormalActivity,使MainActivity重新处于栈顶,调用onRestart重新激活MainActivity。
  4. 绿色部分:点击调转到一个对话的活动,这个时候对话活动只会占据屏幕的一小部分,所以MainActivity并不会处于停止状态,而是处于暂停状态,之后我们点击对话空白处,MainActivity又恢复运行状态,处于栈顶。
  5. 灰色部分:在MainActivity按下Back键,退出MainActivity,此时会摧毁MainActivity,退出应用程序。

以上是我对安卓生命周期的理解,因为第一次写blog,如有错误的地方欢迎大家指出,在下方评论!

ImageDemo

发表于 2018-01-26

Markdown 语法和 MWeb 写作使用说明

Markdown 的设计哲学

Markdown 的目標是實現「易讀易寫」。
不過最需要強調的便是它的可讀性。一份使用 Markdown 格式撰寫的文件應該可以直接以純文字發佈,並且看起來不會像是由許多標籤或是格式指令所構成。
Markdown 的語法有個主要的目的:用來作為一種網路內容的寫作用語言。

阅读全文 »

Test

发表于 2018-01-26 | 分类于 test

Hello World

发表于 2018-01-26

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment

Lurenwei

Lurenwei

To be professional.

5 日志
3 分类
4 标签
RSS
GitHub E-Mail Weibo
© 2018 Lurenwei
由 Hexo 强力驱动
|
主题 — NexT.Muse v6.0.2