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`
+
+
+
+>注意
+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 同样仍处于活动状态
+
+### 生命周期
+
+
+### 启动模式
+* 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 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..6f1200a
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,81 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_show.xml b/app/src/main/res/layout/activity_show.xml
new file mode 100644
index 0000000..362d182
--- /dev/null
+++ b/app/src/main/res/layout/activity_show.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_single_instance.xml b/app/src/main/res/layout/activity_single_instance.xml
new file mode 100644
index 0000000..0a1abe7
--- /dev/null
+++ b/app/src/main/res/layout/activity_single_instance.xml
@@ -0,0 +1,9 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_single_task.xml b/app/src/main/res/layout/activity_single_task.xml
new file mode 100644
index 0000000..487ec05
--- /dev/null
+++ b/app/src/main/res/layout/activity_single_task.xml
@@ -0,0 +1,9 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_single_top.xml b/app/src/main/res/layout/activity_single_top.xml
new file mode 100644
index 0000000..d6c514b
--- /dev/null
+++ b/app/src/main/res/layout/activity_single_top.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/menu_settings.xml b/app/src/main/res/menu/menu_settings.xml
new file mode 100644
index 0000000..a2411e3
--- /dev/null
+++ b/app/src/main/res/menu/menu_settings.xml
@@ -0,0 +1,9 @@
+
+
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..a2f5908
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
new file mode 100644
index 0000000..1b52399
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000..ff10afd
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
new file mode 100644
index 0000000..115a4c7
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..dcd3cd8
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..459ca60
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..8ca12fe
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..8e19b41
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000..b824ebd
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..4c19a13
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
new file mode 100644
index 0000000..3ab3e9c
--- /dev/null
+++ b/app/src/main/res/values/colors.xml
@@ -0,0 +1,6 @@
+
+
+ #3F51B5
+ #303F9F
+ #FF4081
+
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
new file mode 100644
index 0000000..e00c2dd
--- /dev/null
+++ b/app/src/main/res/values/dimens.xml
@@ -0,0 +1,5 @@
+
+
+ 16dp
+ 16dp
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
new file mode 100644
index 0000000..a567296
--- /dev/null
+++ b/app/src/main/res/values/strings.xml
@@ -0,0 +1,4 @@
+
+ ActivityTest
+ Settings
+
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
new file mode 100644
index 0000000..b60a9b2
--- /dev/null
+++ b/app/src/main/res/values/styles.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/xml/backup_descriptor.xml b/app/src/main/res/xml/backup_descriptor.xml
new file mode 100644
index 0000000..6fd6103
--- /dev/null
+++ b/app/src/main/res/xml/backup_descriptor.xml
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/app/src/test/java/org/incoder/activitytest/ExampleUnitTest.java b/app/src/test/java/org/incoder/activitytest/ExampleUnitTest.java
new file mode 100644
index 0000000..2792ab8
--- /dev/null
+++ b/app/src/test/java/org/incoder/activitytest/ExampleUnitTest.java
@@ -0,0 +1,17 @@
+package org.incoder.activitytest;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see Testing documentation
+ */
+public class ExampleUnitTest {
+ @Test
+ public void addition_isCorrect() {
+ assertEquals(4, 2 + 2);
+ }
+}
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000..47825b2
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,27 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+
+buildscript {
+
+ repositories {
+ google()
+ jcenter()
+ }
+ dependencies {
+ classpath 'com.android.tools.build:gradle:3.1.0'
+
+
+ // NOTE: Do not place your application dependencies here; they belong
+ // in the individual module build.gradle files
+ }
+}
+
+allprojects {
+ repositories {
+ google()
+ jcenter()
+ }
+}
+
+task clean(type: Delete) {
+ delete rootProject.buildDir
+}
diff --git a/gradle.properties b/gradle.properties
new file mode 100644
index 0000000..743d692
--- /dev/null
+++ b/gradle.properties
@@ -0,0 +1,13 @@
+# Project-wide Gradle settings.
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+org.gradle.jvmargs=-Xmx1536m
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. More details, visit
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
+# org.gradle.parallel=true
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..7a3265e
Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..e2d44cf
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Thu Apr 05 14:57:12 CST 2018
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip
diff --git a/gradlew b/gradlew
new file mode 100644
index 0000000..cccdd3d
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,172 @@
+#!/usr/bin/env sh
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: 0ドル may be a link
+PRG="0ドル"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*'> /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/">/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED">/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "0ドル"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java>/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=$((i+1))
+ done
+ case $i in
+ (0) set -- ;;
+ (1) set -- "$args0" ;;
+ (2) set -- "$args0" "$args1" ;;
+ (3) set -- "$args0" "$args1" "$args2" ;;
+ (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+ cd "$(dirname "0ドル")"
+fi
+
+exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
new file mode 100644
index 0000000..f955316
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,84 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version>NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/image/unit2-1.png b/image/unit2-1.png
new file mode 100644
index 0000000..a37aa9b
Binary files /dev/null and b/image/unit2-1.png differ
diff --git a/settings.gradle b/settings.gradle
new file mode 100644
index 0000000..e7b4def
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1 @@
+include ':app'