diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..dd17174 --- /dev/null +++ b/.gitignore @@ -0,0 +1,68 @@ +# Built application files +*.apk +*.ap_ + +# Files for the ART/Dalvik VM +*.dex + +# Java class files +*.class + +# Generated files +bin/ +gen/ +out/ + +# Gradle files +.gradle/ +build/ + +# Local configuration file (sdk path, etc) +local.properties + +# Proguard folder generated by Eclipse +proguard/ + +# Log Files +*.log + +# Android Studio Navigation editor temp files +.navigation/ + +# Android Studio captures folder +captures/ + +# IntelliJ +*.iml +.idea/workspace.xml +.idea/tasks.xml +.idea/gradle.xml +.idea/assetWizardSettings.xml +.idea/dictionaries +.idea/libraries +.idea/caches +*.settings/ +*.classpath +*.project + +# Keystore files +# Uncomment the following line if you do not want to check your keystore files in. +#*.jks + +# External native build folder generated in Android Studio 2.2 and later +.externalNativeBuild + +# Google Services (e.g. APIs or Firebase) +google-services.json + +# Freeline +freeline.py +freeline/ +freeline_project_description.json + +# fastlane +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots +fastlane/test_output +fastlane/readme.md \ No newline at end of file diff --git a/LICENSE b/LICENSE index 261eeb9..ad410e1 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ - Apache License +Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ @@ -178,7 +178,7 @@ APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" + boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a @@ -186,7 +186,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright [yyyy] [name of copyright owner] + Copyright {yyyy} {name of copyright owner} Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -198,4 +198,4 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and - limitations under the License. + limitations under the License. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..a099f65 --- /dev/null +++ b/README.md @@ -0,0 +1,96 @@ +本章主要介绍Android四大组件之一,`Activity` + +![Activity](image/unit2-1.png) + +>注意 +1. 现在创建Android应用,默认Activity继承`AppCompatActivity`类 +2. 布局默认使用`ConstraintLayout`约束布局 +3. 系统默认`DarkActionBar`主题 + +>其他 +1. [< application>标签详解](https://developer.android.google.cn/guide/topics/manifest/application-element.html?hl=zh-cn) + +## Activity是什么 +Activity是一种可以包含用户界面的组建,主要用于和用户进行交互 + +## 创建Activity +### 手动创建Activity +1. 创建`class`文件并继承`AppCompatActivity`类,覆写`onCreate`方法 +2. 创建后缀名为`.xml`的布局文件.并 `onCreate`方法中加载布局 +3. `AndroidManifest.xml`文件中注册 + +### 取消标题栏 +* Java代码实现 +```java +if (Build.VERSION.SDK_INT>= Build.VERSION_CODES.KITKAT) { + Objects.requireNonNull(getSupportActionBar()).hide(); +} +``` +>注意:上面这段代码需要在`setContentView()`方法之前执行 + +* 主题配置文件(style.xml)修改,并引用该主题 +```xml + +``` +## Intent +[Intent](https://developer.android.google.cn/guide/components/intents-filters.html?hl=zh-cn) 是一个消息传递对象,您可以使用它从其他应用组件请求操作。 +Intent 可以通过多种方式促进组件之间的通信,但其基本用例主要包括以下三个: +* 启动 Activity +* 启动服务 +* 传递广播 + +### 主要信息 +* 组件名称:要启动的组件名称(可选项)。如果没有组件名称,则 Intent 是隐式的,且系统将根据其他 Intent 信息(例如,操作、数据和类别)决定哪个组件应当接收 Intent。 +* 操作:指定要执行的通用操作(例如,"查看"或"选取")的字符串。 +* 数据:引用待操作数据和/或该数据 MIME 类型的 URI(Uri 对象)。提供的数据类型通常由 Intent 的操作决定。 + + * android:scheme:指定数据的协议部分,如:htt + * android:host:指定数据的主机部分,如:www.baidu.com + * android:port:指定数据的端口部分 + * android:mimeType:指定可以处理的数据类型,允许使用通配符的方式进行指定 +* 类别:一个包含应处理 Intent 组件类型的附加信息的字符串。 您可以将任意数量的类别描述放入一个 Intent 中,但大多数 Intent 均不需要类别。 +* Extra:携带完成请求操作所需的附加信息的键值对。 + +### 显示Intent +```java +Intent(Context packageContext,Class cls); +``` +参数一:提供一个启动Activity的Context,Activity可以直接使用`this` +参数二:指定目标Activity + +### 隐式Intent +指定action +```java +Intent(String action); +``` +每个Intent中只能指定一个action,但却能指定多个category,如果没有指定category,系统默认匹配`android.intent.category.DEFAULT`的category +更多的隐式Intent用法可参考[官网提供示例](https://developer.android.google.cn/guide/components/intents-filters.html?hl=zh-cn#Receiving) + +## 生命周期 + +### 返回栈 +Activity是可以层叠,Android使用任务(Task)来管理Activity,一个任务就是一组存放在栈里的Activity的集合,这个栈也被称作返回栈。 +栈是先进后出的数据结构 +### 活动状态 +Activity 基本上以三种状态存在: +* 继续:此 Activity 位于屏幕前台并具有用户焦点。(有时也将此状态称作"运行中"。) +* 暂停:另一个 Activity 位于屏幕前台并具有用户焦点,但此 Activity 仍可见。也就是说,另一个 Activity 显示在此 Activity 上方,并且该 Activity 部分透明或未覆盖整个屏幕。 +* 停止:该 Activity 被另一个 Activity 完全遮盖(该 Activity 目前位于"后台")。 已停止的 Activity 同样仍处于活动状态 + +### 生命周期 +![Activity 生命周期](https://developer.android.google.cn/images/activity_lifecycle.png?hl=zh-cn) + +### 启动模式 +* standard:默认值。系统始终会在目标任务中创建新的 Activity 实例并向其传送 Intent。 +* singleTop:如果目标任务的顶部已存在一个 Activity 实例,则系统会通过调用该实例的 onNewIntent() 方法向其传送 Intent,而不是创建新的 Activity 实例。 +* singleTask:系统在新任务的根位置创建 Activity 并向其传送 Intent。 不过,如果已存在一个 Activity 实例,则系统会通过调用该实例的 onNewIntent() 方法向其传送 Intent,而不是创建新的 Activity 实例。 +* singleInstance:与"singleTask""相同,只是系统不会将任何其他 Activity 启动到包含实例的任务中。 该 Activity 始终是其任务唯一仅有的成员。 + +"standard"或"singleTop"启动模式的 Activity 可多次实例化。 实例可归属任何任务,并且可以位于 Activity 堆栈中的任何位置。 + +"singleTask"和"singleInstance"Activity 只能启动任务。 它们始终位于 Activity 堆栈的根位置。此外,设备一次只能保留一个 Activity 实例 — 只允许一个此类任务。 + +[详细介绍](https://developer.android.google.cn/guide/topics/manifest/activity-element.html?hl=zh-cn#lmode) \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..52e8ef0 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,29 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 27 + defaultConfig { + applicationId "org.incoder.activitytest" + minSdkVersion 15 + targetSdkVersion 27 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + implementation fileTree(include: ['*.jar'], dir: 'libs') + implementation 'com.android.support:appcompat-v7:27.1.0' + implementation 'com.android.support.constraint:constraint-layout:1.0.2' + implementation 'com.android.support:design:27.1.0' + testImplementation 'junit:junit:4.12' + androidTestImplementation 'com.android.support.test:runner:1.0.1' + androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..f1b4245 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/app/src/androidTest/java/org/incoder/activitytest/ExampleInstrumentedTest.java b/app/src/androidTest/java/org/incoder/activitytest/ExampleInstrumentedTest.java new file mode 100644 index 0000000..56082d1 --- /dev/null +++ b/app/src/androidTest/java/org/incoder/activitytest/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package org.incoder.activitytest; + +import android.content.Context; +import android.support.test.InstrumentationRegistry; +import android.support.test.runner.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getTargetContext(); + + assertEquals("org.incoder.activitytest", appContext.getPackageName()); + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..30aaa01 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/org/incoder/activitytest/DataTransferActivity.java b/app/src/main/java/org/incoder/activitytest/DataTransferActivity.java new file mode 100644 index 0000000..f76bba5 --- /dev/null +++ b/app/src/main/java/org/incoder/activitytest/DataTransferActivity.java @@ -0,0 +1,34 @@ +package org.incoder.activitytest; + +import android.content.Intent; +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.widget.TextView; + +/** + * DataTransferActivity 数据传递 + * + * @author Jerry xu + * @date 4/5/2018 5:00 PM. + */ +public class DataTransferActivity extends AppCompatActivity { + + private TextView mReceiveText; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_data_transfer); + mReceiveText = findViewById(R.id.tv_data); + mReceiveText.setText(getIntent().getStringExtra("sendData")); + } + + @Override + public void onBackPressed() { + Intent returnDataIntent = new Intent(); + returnDataIntent.putExtra("returnData", "DataTransferActivity back to MainActivity"); + setResult(RESULT_OK, returnDataIntent); + finish(); + super.onBackPressed(); + } +} diff --git a/app/src/main/java/org/incoder/activitytest/ImplicitActivity.java b/app/src/main/java/org/incoder/activitytest/ImplicitActivity.java new file mode 100644 index 0000000..de635e1 --- /dev/null +++ b/app/src/main/java/org/incoder/activitytest/ImplicitActivity.java @@ -0,0 +1,27 @@ +package org.incoder.activitytest; + +import android.annotation.SuppressLint; +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.widget.TextView; + +/** + * ImplicitActivity 被隐式启动的Activity + * + * @author Jerry xu + * @date 4/5/2018 5:00 PM. + */ +public class ImplicitActivity extends AppCompatActivity { + + private TextView implicitText; + + @SuppressLint("SetTextI18n") + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_implicit); + implicitText = findViewById(R.id.tv_implicit); + + implicitText.setText("被隐式Intent启动"); + } +} diff --git a/app/src/main/java/org/incoder/activitytest/LifeCycleActivity.java b/app/src/main/java/org/incoder/activitytest/LifeCycleActivity.java new file mode 100644 index 0000000..ce24ebb --- /dev/null +++ b/app/src/main/java/org/incoder/activitytest/LifeCycleActivity.java @@ -0,0 +1,106 @@ +package org.incoder.activitytest; + +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.util.Log; +import android.view.View; +import android.widget.Button; +import android.widget.Toast; + +/** + * LifeCycleActivity Activity生命周期 + * + * @author Jerry xu + * @date 4/5/2018 7:00 PM. + */ +public class LifeCycleActivity extends AppCompatActivity implements View.OnClickListener { + + private static final String TAG = "LifeCycleActivity"; + private Button mDialog; + + /** + * Activity第一次被创建时调用 + */ + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_life_cycle); + mDialog = findViewById(R.id.btn_dialog); + mDialog.setOnClickListener(this); + Log.i(TAG, "onCreate"); + } + + /** + * Activity由"停止"状态变为"继续"状态之前调用 + */ + @Override + protected void onRestart() { + super.onRestart(); + } + + /** + * Activity由不可见变为可见时调用 + */ + @Override + protected void onStart() { + super.onStart(); + Log.i(TAG, "onStart"); + } + + /** + * Activity准备好和用户进行交互时调用(此时Activity一定位于栈顶,并且处于"继续"状态) + */ + @Override + protected void onResume() { + super.onResume(); + Log.i(TAG, "onResume"); + } + + /** + * 系统准备启动或者恢复另一个Activity时调用 + */ + @Override + protected void onPause() { + super.onPause(); + Log.i(TAG, "onStart"); + } + + /** + * Activity完全不可见时调用 + */ + @Override + protected void onStop() { + super.onStop(); + Log.i(TAG, "onStop"); + } + + /** + * Activity被销毁之前调用 + */ + @Override + protected void onDestroy() { + super.onDestroy(); + Log.i(TAG, "onDestroy"); + } + + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.btn_dialog: + AlertDialog.Builder builder = new AlertDialog.Builder(LifeCycleActivity.this); + builder.setTitle("这是对话框Dialog") + .setMessage("这里是主体内容。。。") + .setPositiveButton("确定", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + Toast.makeText(LifeCycleActivity.this, "close dialog", Toast.LENGTH_SHORT).show(); + } + }).create().show(); + break; + default: + break; + } + } +} diff --git a/app/src/main/java/org/incoder/activitytest/MainActivity.java b/app/src/main/java/org/incoder/activitytest/MainActivity.java new file mode 100644 index 0000000..da62e2e --- /dev/null +++ b/app/src/main/java/org/incoder/activitytest/MainActivity.java @@ -0,0 +1,207 @@ +package org.incoder.activitytest; + +import android.content.Intent; +import android.os.Bundle; +import android.support.design.widget.Snackbar; +import android.support.v7.app.AppCompatActivity; +import android.util.Log; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.widget.Button; +import android.widget.Toast; + +/** + * MainActivity + * + * @author Jerry xu + * @date 4/5/2018 3:00 PM. + */ +public class MainActivity extends AppCompatActivity implements View.OnClickListener, View.OnLongClickListener { + + private Button mImplicit; + private Button mShow; + private Button mSendData; + private Button mLifeCycle; + private Button mStandard; + private Button mSingleTop; + private Button mSingleTask; + private Button mSingleInstance; + private static final String TAG = "MainActivity"; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + /*// 隐藏标题栏 + if (Build.VERSION.SDK_INT>= Build.VERSION_CODES.KITKAT) { + Objects.requireNonNull(getSupportActionBar()).hide(); + }*/ + setContentView(R.layout.activity_main); + mShow = findViewById(R.id.btn_start_show); + mImplicit = findViewById(R.id.btn_start_implicit); + mSendData = findViewById(R.id.btn_send_data); + mLifeCycle = findViewById(R.id.btn_life_cycle); + mStandard = findViewById(R.id.btn_standard); + mSingleTop = findViewById(R.id.btn_singletop); + mSingleTask = findViewById(R.id.btn_singletask); + mSingleInstance = findViewById(R.id.btn_singleinstance); + + mShow.setOnClickListener(this); + mImplicit.setOnClickListener(this); + mImplicit.setOnLongClickListener(this); + mSendData.setOnClickListener(this); + mSendData.setOnLongClickListener(this); + mLifeCycle.setOnClickListener(this); + mStandard.setOnClickListener(this); + mSingleTop.setOnClickListener(this); + mSingleTask.setOnClickListener(this); + mSingleInstance.setOnClickListener(this); + + // 如果被系统销毁当前Activity,回退到当前Activity,会重新执行onCreate,而不是直接执行onRestart方法 + if (savedInstanceState != null) { + String tempData = savedInstanceState.getString("key"); + Log.d(TAG, tempData); + } + Log.i(TAG, "onCreate"); + } + + @Override + protected void onStart() { + super.onStart(); + Log.i(TAG, "onStart"); + } + + @Override + protected void onResume() { + super.onResume(); + Log.i(TAG, "onResume"); + } + + @Override + protected void onPause() { + super.onPause(); + Log.i(TAG, "onPause"); + } + + @Override + protected void onStop() { + super.onStop(); + Log.i(TAG, "onStop"); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + Log.i(TAG, "onDestroy"); + } + + @Override + public void onClick(View v) { + switch (v.getId()) { + // 显示启动Activity + case R.id.btn_start_show: + Intent showIntent = new Intent(this, ShowActivity.class); + startActivity(showIntent); + break; + // 隐式启动Activity + case R.id.btn_start_implicit: + Intent implicitIntent = new Intent("org.incoder.activitytest.ACTION_START"); + startActivity(implicitIntent); + break; + // 传递数据 + case R.id.btn_send_data: + Intent sendDataIntent = new Intent(this, DataTransferActivity.class); + sendDataIntent.putExtra("sendData", "MainActivity send to DataTransferActivity"); + startActivity(sendDataIntent); + break; + // Activity生命周期 + case R.id.btn_life_cycle: + Intent lifeCycleIntent = new Intent(this, LifeCycleActivity.class); + startActivity(lifeCycleIntent); + break; + // standard启动 + case R.id.btn_standard: + Intent standardIntent = new Intent(this, MainActivity.class); + startActivity(standardIntent); + break; + // singleTop启动 + case R.id.btn_singletop: + Intent singleTopIntent = new Intent(this, SingleTopActivity.class); + startActivity(singleTopIntent); + break; + // singleTask启动 + case R.id.btn_singletask: + Intent singleTaskIntent = new Intent(this, SingleTopActivity.class); + startActivity(singleTaskIntent); + break; + // singleInstance启动 + case R.id.btn_singleinstance: + Intent singleInstanceIntent = new Intent(this, SingleTopActivity.class); + startActivity(singleInstanceIntent); + break; + default: + break; + } + } + + @Override + public boolean onLongClick(View v) { + switch (v.getId()) { + // 长按隐式启动 + case R.id.btn_start_implicit: + Intent sendIntent = new Intent(); + sendIntent.setAction(Intent.ACTION_SEND); + sendIntent.putExtra(Intent.EXTRA_TEXT, "测试"); + sendIntent.setType("text/plain"); + if (sendIntent.resolveActivity(getPackageManager()) != null) { + startActivity(sendIntent); + } + break; + // 长按传递数据并回调 + case R.id.btn_send_data: + Intent sendDataIntent = new Intent(this, DataTransferActivity.class); + sendDataIntent.putExtra("sendData", "MainActivity send to DataTransferActivity"); + startActivityForResult(sendDataIntent, 0); + break; + default: + break; + } + return false; + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.menu_settings, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + int id = item.getItemId(); + + if (id == R.id.action_settings) { + Toast.makeText(this, "OnClick Settings", Toast.LENGTH_SHORT).show(); + return true; + } + + return super.onOptionsItemSelected(item); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (requestCode == 0 && data != null) { + String textContent = data.getStringExtra("returnData"); + Snackbar.make(mSendData, textContent, Snackbar.LENGTH_LONG).setAction("Action", null).show(); + } + } + + /** + * 当前Activity被系统销毁前调用,可以用来保存临时数据 + */ + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + outState.putString("key", "value"); + } +} diff --git a/app/src/main/java/org/incoder/activitytest/ShowActivity.java b/app/src/main/java/org/incoder/activitytest/ShowActivity.java new file mode 100644 index 0000000..50ba1b1 --- /dev/null +++ b/app/src/main/java/org/incoder/activitytest/ShowActivity.java @@ -0,0 +1,26 @@ +package org.incoder.activitytest; + +import android.annotation.SuppressLint; +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.widget.TextView; + +/** + * ShowActivity 被显示启动的Activity + * + * @author Jerry xu + * @date 4/5/2018 5:00 PM. + */ +public class ShowActivity extends AppCompatActivity { + + private TextView showText; + + @SuppressLint("SetTextI18n") + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_show); + showText = findViewById(R.id.tv_show); + showText.setText("被显示Intent启动"); + } +} diff --git a/app/src/main/java/org/incoder/activitytest/SingleInstanceActivity.java b/app/src/main/java/org/incoder/activitytest/SingleInstanceActivity.java new file mode 100644 index 0000000..8915ce0 --- /dev/null +++ b/app/src/main/java/org/incoder/activitytest/SingleInstanceActivity.java @@ -0,0 +1,58 @@ +package org.incoder.activitytest; + +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.util.Log; + +/** + * SingleInstanceActivity + * + * @author Jerry xu + * @date 4/6/2018 0:00 AM. + */ +public class SingleInstanceActivity extends AppCompatActivity { + + private static final String TAG = "SingleInstanceActivity"; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_single_instance); + } + + @Override + protected void onRestart() { + super.onRestart(); + Log.d(TAG, "onRestart"); + } + + @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 onDestroy() { + super.onDestroy(); + Log.d(TAG, "onDestroy"); + } +} diff --git a/app/src/main/java/org/incoder/activitytest/SingleTaskActivity.java b/app/src/main/java/org/incoder/activitytest/SingleTaskActivity.java new file mode 100644 index 0000000..a1a62a1 --- /dev/null +++ b/app/src/main/java/org/incoder/activitytest/SingleTaskActivity.java @@ -0,0 +1,60 @@ +package org.incoder.activitytest; + +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.util.Log; + +/** + * SingleTaskActivity + * + * @author Jerry xu + * @date 4/6/2018 0:00 AM. + */ +public class SingleTaskActivity extends AppCompatActivity { + + private static final String TAG = "SingleTaskActivity"; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_single_task); + } + + @Override + protected void onRestart() { + super.onRestart(); + Log.d(TAG, "onRestart"); + } + + @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 onDestroy() { + super.onDestroy(); + Log.d(TAG, "onDestroy"); + } + + +} diff --git a/app/src/main/java/org/incoder/activitytest/SingleTopActivity.java b/app/src/main/java/org/incoder/activitytest/SingleTopActivity.java new file mode 100644 index 0000000..54607ed --- /dev/null +++ b/app/src/main/java/org/incoder/activitytest/SingleTopActivity.java @@ -0,0 +1,72 @@ +package org.incoder.activitytest; + +import android.content.Intent; +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.util.Log; +import android.view.View; +import android.widget.Button; + +/** + * SingleTopActivity + * + * @author Jerry xu + * @date 4/6/2018 0:00 AM. + */ +public class SingleTopActivity extends AppCompatActivity { + + private Button mTopToMain; + private static final String TAG = "SingleTopActivity"; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_single_top); + mTopToMain = findViewById(R.id.btn_top_back_main); + + mTopToMain.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(SingleTopActivity.this, MainActivity.class); + startActivity(intent); + } + }); + } + + @Override + protected void onRestart() { + super.onRestart(); + Log.d(TAG, "onRestart"); + } + + @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 onDestroy() { + super.onDestroy(); + Log.d(TAG, "onDestroy"); + } + +} diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..c7bd21d --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..d5fccc5 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_data_transfer.xml b/app/src/main/res/layout/activity_data_transfer.xml new file mode 100644 index 0000000..eacc62f --- /dev/null +++ b/app/src/main/res/layout/activity_data_transfer.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_implicit.xml b/app/src/main/res/layout/activity_implicit.xml new file mode 100644 index 0000000..3a93e55 --- /dev/null +++ b/app/src/main/res/layout/activity_implicit.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_life_cycle.xml b/app/src/main/res/layout/activity_life_cycle.xml new file mode 100644 index 0000000..b47b585 --- /dev/null +++ b/app/src/main/res/layout/activity_life_cycle.xml @@ -0,0 +1,19 @@ + + + +