• golang 移动应用例子 example/basic 源码框架分析


    条件编译

    我们在源码中可以看到2个文件: main.go 和 main_x.go 这两个包名都是 package main , 都有 main 函数。 不会冲突么?

    答案是不会的,

    main_x.go 文件中有个注释:

    // +build !darwin,!linux,!windows

    main.go 文件中注释如下:

    // +build darwin linux windows
    这里来标示编译适用的不同环境。只有满足条件的才会被编译进去, 所以这里有2个 main 函数,编译并不冲突。

    参考:

    http://blog.csdn.net/varding/article/details/12675971 

    http://dave.cheney.net/2013/10/12/how-to-use-conditional-compilation-with-the-go-build-tool 

    Android应用启动入口

    APK文件本身是一个压缩包,直接用解压工具即可打开,但里面的文件都已被编码为二进制文件格式,不能直接看,比如程序描述文件AndroidManifest.xml,使用apktool工具可以将这些文件解码还原出来。
    apktool(http://code.google.com/p/android-apktool/  现在地址是: http://ibotpeaches.github.io/Apktool/ )是一个非常著名的开源工具包,功能很强大,可以解包APK文件并重新打包,常用来汉化Android应用。

    apktool 安装方法请看: http://ibotpeaches.github.io/Apktool/install/

    参考: http://kenkao.iteye.com/blog/1890497

    使用这个工具我们可以看到basic.apk文件的 AndroidManifest.xml 文件的内容如下:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest package="org.golang.todo.basic" android:versionCode="1" android:versionName="1.0"
      xmlns:android="http://schemas.android.com/apk/res/android">
        <application android:label="Basic" android:debuggable="true">
            <activity android:name="org.golang.app.GoNativeActivity" android:label="Basic" android:configChanges="keyboardHidden|orientation">
                <meta-data android:name="android.app.lib_name" android:value="basic" />
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    </manifest>

    这个就是apk文件的执行入口,而不是做服务器段开发的 main 函数入口。

    这里隐含的实现了 org.golang.app.GoNativeActivity 这个Activity。

    具体这里的逻辑被封装在 golang.org/x/mobile/app 代码中。

    主要的核心代码如下:

    func main() {
        app.Main(func(a app.App) {
            for e := range a.Events() {
                switch e := a.Filter(e).(type) {
                case lifecycle.Event:
                    // ...
                case size.Event:
                    // ...
                case paint.Event:
                    // ...
                case touch.Event:
                    // ...
                }
            }
        })
    }

    image

    不同的事件随后触发不同的函数。完成这些功能。

    从字面理解就可以知道这几个事件是做啥的。

    lifecycle.Event  Activity 生命周期相关的几个事件;

    size.Event  屏幕尺寸变化相关事件

    paint.Event  绘画屏幕的事件

    touch.Event 触屏或者鼠标左键点击和移动事件

  • 相关阅读:
    Tips_信息列表(手风琴)效果的多种实现方法
    JS_ Date对象应用实例
    JS _函数作用域及变量提升
    C_使用clock()函数获取程序执行时间
    C_输入一个整数N,输出从0~N(算法思考)
    Chrome_查看 webSocket 连接信息
    Chrome_断点调试(使用vue-resource进行数据交互)
    Tips_利用padding实现高度可控的分隔线
    CSS_圣杯布局和双飞翼布局
    Tips_一级菜单栏实现
  • 原文地址:https://www.cnblogs.com/ghj1976/p/5178390.html
Copyright © 2020-2023  润新知