最近突然被安排写android,整个人都是蒙的🤦♀️
首先呢我是一名后端开发,平时也写一些前端代码,现在又被安排写android
原因很简单:大家都说会写java的人就会写android🤢
但是我想说的是我后端还没整明白呢😢
作为一个合格的打工人🐱🚀,只能硬着头皮上,每天给自己洗脑,我是公司的一块砖哪里需要哪里搬
好了 相信很多人也有我这样的困扰,接下来讲的内容只适合小白。只是记录一下,对于0基础的我去完成Android功能的过程。大佬请绕道,或者评论区给补充👀
有喜欢或想要深入研究Android的朋友,欢迎关注我男朋友的博客哦,他在这方面更加专业。
https://zhujiang.blog.csdn.net/
目录
一、创建项目
此处省略如何安卓android studio....,关于连接git,参考这篇文章👇https://mp.csdn.net/editor/html/116586847
File--->new project 选择自己需要的模板
创建自己的项目名称和选择编程的语言,由于我没有学习过Kotlin,所以我选择的是java。
创建好的项目如下图所示:红线框起来的地方可以切换项目显示的类型,我一般都给它切换成project,感觉更舒服一些
二、项目结构介绍
序号1、2:里面是java代码,每一个Activity对应一个.xml文件,xml文件主要是布局,我们可以简单理解为界面。而avtivity的作用是加载xml中的组件(一般xml中会设置id,activity通过id去查找对应的组件),从而实现一些功能。给我的感觉就是前后端揉在一起的感觉,这也是写完前后端分离再来看android项目,感觉最变扭的地方(说实话具体里面的组件什么的我还没摸清楚,这篇文章的主要意图呢,是希望帮助像我一样从未搞过android的小白,可以快速上手,所以细节就不过多赘述)
例如:学啥都从hello world开始 哈哈哈哈
运行结果:
序号3、这个文件控制了app的名字和图标等有关app的配置,同时需要添加权限也是这里配置(例如:网络权限、联网权限及录音等等,用到的时候可以网上查,有很多例子,你只需要指定有关权限配置的你就添加到这里)
下面是我所做功能的文件,我粘贴到了这里
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="cn.most.ic.KJBGovSerPlatform">
<!-- 网络权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!--获取手机相关信息-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name = "android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name = "android.permission.WAKE_LOCK" />
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 录音权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!-- 在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
tools:ignore="ProtectedPermissions" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher1"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:usesCleartextTraffic="true"
android:theme="@android:style/Theme.Holo.Light.NoActionBar"
tools:replace="android:icon,android:theme">
<!--android:theme 隐藏掉app的导航栏-->
<activity android:name=".MainActivity" android:theme="@style/Theme.AppCompat.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
序号4、5、6: 这里涉及到gradle文件----添加依赖的文件
settings.gradle
settings.gradle 的作用就是一些模块被包含过后,就需要在这里声明:
rootProject.name = "My Application"
include ':app'
project目录下的build.gradle文件定义在这个工程下的所有模块的公共属性
module下的build.gradle文件定义只对本模块起作用,其实这两者的区别比较像java的分布式项目里的依赖关系。
反正呢 需要添加依赖包那你就直接在对应的gradle文件中加
三、连接真机测试
上述简单讲了一下项目基本构成,接下来就到了启动测试环节了。我这个是已经安装好的,如果你没有启动项,进行如下操作:
画红框的部分如果出现no module的情况不要着急,继续往下看。(不知道是不是适用全部此类报错,反正我每次有关启动的问题都是通过以下方式解决的)
File--->project structure
好了启动项ok了,没有连接真机的情况下,会出现虚拟机,启动效果就说上面的hello world示例。这里注意 启动真机时得将手机设置为开发者模式。之后启动后手机上会出现app,表示启动成功喽
四、android生命周期
在android中明白其中的生命周期极其重要。没看生命周期之前 反正我直接看代码是头大的。不排除我菜的原因哈
Activity的生命周期共七个指示器:onCreate、onStart、onResume、onPause、onStop、onDestroy、onRestart。
一图解百惑
onCreate():不可见状态
在Activity被创建时回调,第一个生命周期。一般在创建Activity时需要重写该方法做一些初始化操作,最常用的例如通过setContentView()设置界面布局资源,初始化所需要的组件信息等。
onStart():可见状态
该方法回调表示Activity正在启动,此时avtivity处于可见状态,只是前台没有显示出来,因此用户无法交互。
onResume():可见状态
此方法回调时,Activity已经在屏幕上显示UI允许用户操作了。当Activity停止后,重写回到前台时也会调用onResume()。
onPause():
此方法回调时,Activity正在停止(Paused形态),通常接下来 onStop() 会被回调 。但通过流程图可见,另一种情况是onPause() 执行后直接执行了onResume方法,这可能是用户点击Home键,让程序退回到主界面,程序在后台运行时又迅速地再回到到当前的Activity,此时onResume方法就会被回调。我们可以在onPause方法中做一些数据存储、动画停止、资源回收等操作。另外,onPause方法执行完成后,新Activity的onResume方法才会被执行。所以onPause不能太耗时,因为这可能会影响到新的Activity的显示。
onStop():不可见状态
此方法回调,Activity即将停止或者完全覆盖,此时Activity不可见,仅在后台运行。onStop方法可以做一些资源释放的操作,不能太耗时
onRestart():可见状态
调用该方法,表示Activity在重写启动,有不可见状态变为可见状态。这种情况,一般发生在用户打开了一个新的Activity时,之前的Activity就会被onStop,接着又回到之前Activity页面时,之前的Activity的 onRestart方法就会被回调。
onDestory():不可见状态
此方法回调时,表示Activity正在被销毁
五、js和android交互
配置:
***Activity:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView = new WebView(this);
setContentView(webView);
// 设置支持js
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
/**
* 为webView添加注册js 接口回调监听
* 参数一:接口对象 参数二:接口别名(js使用)
* 如果别名叫aa,那么js调用接口的时候就要写成window.aa
*/
webView.addJavascriptInterface(this, "android");
webView.loadUrl("http://39.104.52.230/test.html");
// 防止webView跳转浏览器
webView.setWebViewClient(new WebViewClient());
}
AndroidManifest.xml:
<!-- 网络权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
js中调用android的方法
js代码:jsonStr为自行拼接json(这个是根据需求写),actionFromJs为android方法
var data = {
"function": "device",
"action": "",
"successCallBack": "KJBMobile.startRecordAudioSuccessCallback",
"failCallBack": "KJBMobile.startRecordAudioFailCallback"
}
var jsonStr = JSON.stringify(data);
window.android.actionFromJs(jsonStr);
android方法:一定要在方法上加@JavascriptInterface
@JavascriptInterface
public void actionFromJs(String data){
BaseBean bean=new Gson().fromJson(data,BaseBean.class);
switch (bean.getFunction()){
case "camera":
callCamera(bean.getFailCallBack(),bean.getSuccessCallBack());
break;
case "device":
getDeviceInfo(bean.getFailCallBack(),bean.getSuccessCallBack());
break;
default:
break;
}
}
android调用js的方法
fail为js中定义的方法,ResultUtils...为我返回值的封装类。
webView.loadUrl("javascript:"+fail+"('" + ResultUtils.error("获取基本信息失败") + "')");
六、项目打包
如果你只是简单测试,
正常打包:
https://www.runoob.com/w3cnote/android-tutorial-sign-package.html
好啦,和大家分享的内容到此结束啦。能力有限 只是把自己在零基础的情况下写android的一点小总结,毕竟大佬难懂小白的痛苦。哈哈哈 加油👉,如果喜欢我的文章记得点赞哦❤