创建工程
这个过程主要是定义包名,应用名字等等。
-
菜单命令:
New -> New Project... Project
是很重要的一个概念,可以简单地认为,一个应用可以用一个Project来代替,就算有各终端,比如“学生端”,“老师端”,“iPad版”,“手机版”... ... -
选择模板,一般选择
Empty Activity
- 配置工程,
Config Project
。这一页其实不叫重要,想应用名字,包id之类
- 工程是可以直接运行的,当然页面是空白的,只有一个字符“Hello World”
程序入口
- 以
MultiDexApplication
为基类,需要在build.gradle
文件中导入这个包
- 创建自定义的类,这里命名为
CashierApplication
- 在
AndroidManifest.xml
中注册。
- 在这里,可以做一些程序启动,首页展示之前的一些工作,比如第三方库初始化,获取应用实例,获取主线程
Handler
等工作。
package com.kjtpay.app;
import android.app.Application;
import android.os.Looper;
import androidx.multidex.MultiDexApplication;
import android.os.Handler;
/**
* 程序入口
*/
public class CashierApplication extends MultiDexApplication {
private static Application mInstance;
private static Handler mHandler;
public static Application getApplication() {
return mInstance;
}
public static Handler getHandler() {
if (null == mHandler) {
synchronized (Handler.class) {
mHandler = new Handler(Looper.getMainLooper());
}
}
return mHandler;
}
@Override
public void onCreate() {
super.onCreate();
// 保存实例
mInstance = this;
// 第三方初始化
sdkInitial();
// 初始化接口
initial();
}
// 初始化三方库
private void sdkInitial() {
}
// 初始化接口
private void initial() {
}
}
基类Activity
-
Android
里的文件夹都是包,类都放在某个包里。所以文件夹的名字习惯用小写。这里新建一个名字叫base
的包。菜单:File -> New -> Package
;在弹出的包名里面接上base
。成为com.kjtpay.app.base
-
有一些公共的内容,写在基类里面,会方便很多。
-
这个是属于
Activity
的,所以采用菜单File -> New -> Activity -> Empty Activity
比较方便。
-
一开始可以什么也没有,等有公共的需求时,再放入,比如日志,友盟统计等。
-
由于基类不能直接使用,所以添加
abstract
关键字,并且从注册文件AndroidManifest.xml
中删除注册信息
package com.kjtpay.app.base;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
/***
* activity 基类
* */
public abstract class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onPause() {
super.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
}
public boolean isLiving() {
return (!isDestroyed() && !isFinishing());
}
}
什么也没做,留着以后慢慢加内容
广告页
在展示首页之前,往往有些活动介绍,或者说是广告。所以,第一个展示的页面,往往不是首页,而是一般被称为splash
的广告页。
- 菜单仍然是
File -> New -> Activity -> Empty Activity
- 点击
Finish
之后,展示新增的文件,询问是否加入git,一般都加的,保持默认就好。
- 设为启动页。默认的启动页已经删除,这里要重新设置一个。
- 运行一下,跟默认的有点不一样了,至少字符串“Hello World”不见了。
对于android.intent.action.MAIN和android.intent.category.LAUNCHER的理解
首页
默认生成的MainActivity
只有一个Hello World
字符串,大多数情况下并不符合需求。所以一般会删除,重新生成一个。
-
和上面的一样,生成一个新的,名字叫
HomeActivity
的页面,作为首页。 -
这样生成的
Activity
,在AndroidManifest.xml
中会自动注册
- 虽然名字叫“首页”,但是应用第一启动页面并不是它,所以,没有必要添加代表默认启动的语句:
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
- 闪屏页目前是空白的,等以后有广告需求再添加内容。现在要从闪屏页跳转到首页,跳转代码放在哪里呢?
理论上放哪都行,不过,这里还是放在首页当中,并且做成静态函数的方式,方便调用。理由很简单,从闪屏页去哪里不知道,但是作为首页,想跳过来,最低要求,只要对方给Context就可以了。这样做的好处,就是跳转代码可以集中在一个地方。
public class HomeActivity extends BaseActivity {
private static final String SOURCE_NAME = "source_name";
/***
* 跳转到首页,并指明来源名字
* */
public static void launch(Context context, String sourceName) {
if (null != context) {
Intent intent = new Intent();
intent.setClass(context, HomeActivity.class);
intent.putExtra(SOURCE_NAME, sourceName);
if (!(context instanceof Activity)) {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
context.startActivity(intent);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
// 展示来源名字
Intent intent = getIntent();
String sourceName = intent.getStringExtra(SOURCE_NAME);
Toast.makeText(HomeActivity.this, "从页面"+sourceName+"跳转过来", Toast.LENGTH_LONG).show();
}
}
public class SplashActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
// 跳转到首页
HomeActivity.launch(SplashActivity.this, "闪屏广告页");
}
}
企业微信截图_97bb20b4-cc05-47ba-a4fc-102c244754ac.png
网友评论