当前位置:  编程技术>移动开发
本页文章导读:
    ▪Titanium view 腾挪 排序        Titanium view 移动 排序最近要在tablet和ipad上开发,为了做到cross platform,选用了titanium这个开发工具,感觉还可以,除了环境慢一些。 Titanium号称一次开发,分别可以在android以及ios上运行。 .........
    ▪ 进程间通讯(1)        进程间通讯(一)进程间通信最简单的方式就是发送WM_COPYDATA消息。   发送WM_COPYDATA消息: SendMessage(接收窗口句柄,WM_COPYDATA, (WPARAM)发送窗口句柄, (LPARAM)&CopyData);   其中的CopyData为COPYDATASTRUCT.........
    ▪ Activity生命周期胪陈       Activity生命周期详述 activity是单独的,用于处理用户操作。几乎所有的activity都要和用户打交道,所以activity类创建了一个窗口,开发人员可以通过setContentView(View)接口把UI放到activity创建的窗.........

[1]Titanium view 腾挪 排序
    来源: 互联网  发布时间: 2014-02-18
Titanium view 移动 排序

最近要在tablet和ipad上开发,为了做到cross platform,选用了titanium这个开发工具,感觉还可以,除了环境慢一些。

Titanium号称一次开发,分别可以在android以及ios上运行。


今天简单实现了一个对几个view移动排序的功能,通过手指的拖拽,拿上来分享一下。

注意只在android上做了测试。



var window = Ti.UI.createWindow({
    backgroundColor : 'white',
    fullscreen : false
});

var v_space = 10;
var c_height = 100;
var ismoving = false;
var moving_obj;
var blank_pos;
var start_y = 0;
var start_top = 0;

var onViewTouchstart = function(e) {
    if (!e.source.id || e.source.id != "t_box") {
        return;
    }

    if (ismoving) {
        return;
    }
    moving_obj = getCByTouchY(t_box, e.y);
    if (moving_obj != null) {
        ismoving = true;
    } else {
        return;
    }

    moving_obj.opacity = 0.6;

    blank_pos = moving_obj.id;

    start_top = moving_obj.top;
    start_y = e.y;
};

var onViewTouchmove = function(e) {

    if (!ismoving) {
        return;
    }

    var ey = e.y;
    var e_pos = Math.floor((ey - 10) / (v_space + c_height));

    var c_willmove = getCByTouchY(t_box, ey);
    if (c_willmove != null) {
        c_willmove.top = blank_pos * (v_space + c_height) + 10;
        c_willmove.id = blank_pos;
        blank_pos = e_pos;
    } else {
    }

    moving_obj.top = start_top + ey - start_y;
};

var onViewTouchend = function(e) {
    if (!ismoving) {
        return;
    }

    moving_obj.opacity = 1;
    moving_obj.id = blank_pos;
    moving_obj.top = blank_pos * (v_space + c_height) + 10;

    ismoving = false;
    moving_obj = null;

};

var onViewTouchcancel = function(e) {
    if (!ismoving) {
        return;
    }

    moving_obj.opacity = 1;
    moving_obj.id = blank_pos;
    moving_obj.top = blank_pos * (v_space + c_height) + 10;

    ismoving = false;
    moving_obj = null;

};

var t_box = Ti.UI.createView({
    id : "t_box",
    backgroundColor : "#999",
    bottom : 250,
    left : 10,
    right : 10,
    height : 450
});

for (var i = 0; i < 4; i++) {

    var test_view = Ti.UI.createView({
        id : i,
        backgroundColor : "#00f",
        top : i * (v_space + c_height) + 10,
        left : 20,
        width : 200,
        height : c_height,
        touchEnabled : false
    });
    var aLabel = Ti.UI.createLabel({
        text : 'Label' + i,
        font : {
            fontSize : 20
        },
        textAlign : 'center',
        touchEnabled : false
    });
    test_view.add(aLabel);

    t_box.add(test_view);
}

t_box.addEventListener("touchstart", onViewTouchstart);
t_box.addEventListener("touchmove", onViewTouchmove);
t_box.addEventListener("touchend", onViewTouchend);
t_box.addEventListener("touchcancel", onViewTouchcancel);

function getCByTouchY(p, pos_y) {
    var childs = p.children;

    for (var i = 0; i < childs.length; i++) {
        var c = childs[i];
        if (c == moving_obj) {
            continue;
        }
        if (c.top < pos_y && (c.top + c_height ) > pos_y) {
            return c;
        }
    }

    return null;
}

window.add(t_box);

window.open();



    
[2] 进程间通讯(1)
    来源: 互联网  发布时间: 2014-02-18
进程间通讯(一)

进程间通信最简单的方式就是发送WM_COPYDATA消息。

 

发送WM_COPYDATA消息:

SendMessage(接收窗口句柄,WM_COPYDATA, (WPARAM)发送窗口句柄, (LPARAM)&CopyData);

 

其中的CopyData为COPYDATASTRUCT结构类型,该结构定义如下:

typedef struct tagCOPYDATASTRUCT {

开发中有时需要进程间传递数据,比如对于只允许单实例运行的程序,当已有实例运行时,再次打开程序,可能需要向当前运行的实例传递信息进行特殊处理。对于传递少量数据的情况,最简单的就是用SendMessage发送WM_COPYDATA消息,所带参数wParam和lParam可以携带相关数据。由于SendMessage是阻塞的,在接收数据进程处理完数据之前不会返回,发送方不会删除或修改数据,因此这种方法是简单且安全的,不过数据量不能太大,否则会由于处理时间过长造成阻塞假死。

    用SendMessage发送WM_COPYDATA的方法如下:

    lResult = SendMessage(     // returns LRESULT in lResult        (HWND) hWndControl,     // handle to destination control        (UINT) WM_COPYDATA,     // message ID        (WPARAM) wParam,     // = (WPARAM) () wParam;        (LPARAM) lParam     // = (LPARAM) () lParam;

    );

   

 

    其中,wParam为发送数据方的窗口句柄,lParam为指向一个COPYDATASTRUCT类型结构体的指针,该结构体中包含了传递的数据信息。COPYDATASTRUCT定义如下:

    typedef struct tagCOPYDATASTRUCT {
        ULONG_PTR dwData;
        DWORD cbData;
        PVOID lpData;
    } COPYDATASTRUCT, *PCOPYDATASTRUCT;

    其中,dwData为自定义的数据,cbData指定lpData指向数据的大小,lpData为指向数据的指针。按照前面所说,在使用WM_COPYDATA时要保证数据的只读属性,即不能有发送方的其他线程对传递数据进行改写。(这也解释了为什么不允许用PostMessage发送WM_COPYDATA,因为PostMessage函数是异步的。还有一点需要注意的是由于SendMessage是阻塞的,所以容易引起死锁,可以考虑用SendMessageTimeout代替。)另外,如果传递数据中涉及到对象或系统资源,必须确保接收方可以对其进行处理,比如HDC、HBITMAP之类的资源是无效的,他们属于不同的进程。

    在使用的时候,要用FindWindow等API找到接收方的窗口句柄;接收方的程序中要添加对WM_COPYDATA消息的响应。

   

    前几天写程序用到WM_COPYDATA进行进程间通信,但是接收方怎么也收不到消息。调试发现找到的窗口句柄是没有问题的,查看MSDN也没有什么提示,百思不得其解。

    后来看了一些示例代码,发现不同之处是我的SendMessage调用中wParam和lParam参数都是0,因为我只是需要通过WM_COPYDATA消息通知一下接收程序即可,不用传递任何数据。试着将这两个参数改为非空,接收方就可以收到消息了。总结结论为:wParam参数是否为0没有影响,但是lParam参数必须为非空,即必须指向一个有效的COPYDATASTRUCT结构体。

    原因是什么呢?查了一些资料发现,SendMessage(WM_COPYDATA)底层是通过文件映射(File Mapping)完成的,大概流程是发送方线程根据COPYDATASTRUCT结构体中的传递数据信息,在共享内存中进行数据复制,接收方线程则会到共享内存中读取数据进行处理。因此如果指向COPYDATASTRUCT结构的指针为空的话,流程是无法进行的,所以接收方也理所当然收不到消息。

 

前面这段是转载的.自己最近再次去深究核心编程,这里给出的例子也是父进程与子进程之间进行通讯的方式:

父进程:

#include <Windows.h>
#include <iostream>
#include <sstream>
#include <string>
#include <iomanip>
#include "CString.h"

using namespace std;

void main()
{
 STARTUPINFO si = {sizeof(STARTUPINFO)};
 SECURITY_ATTRIBUTES saProcess,saThread;
 PROCESS_INFORMATION poProcessChild;
 
 DWORD dProcessID = GetCurrentProcessId();
 
 TCHAR str[100];

 wsprintf( str,TEXT("%s %ld"),TEXT("E:\\测试程序\\2012-8-5\\RecvProcess\\Debug\\RecvProcess.exe"),dProcessID );

 saThread.lpSecurityDescriptor = NULL;
 saThread.bInheritHandle = TRUE;
 saThread.nLength = sizeof( SECURITY_ATTRIBUTES );

 saProcess.lpSecurityDescriptor = NULL;
 saProcess.bInheritHandle = TRUE;
 saProcess.nLength = sizeof( SECURITY_ATTRIBUTES );

 BOOL bCreate = CreateProcess( NULL,str,&saProcess,&saThread,TRUE,CREATE_SUSPENDED,NULL,NULL,&si,&poProcessChild );
 HWND hWnd = FindWindow( NULL,TEXT("RecvProcess") );
 
 ResumeThread( poProcessChild.hThread );
 COPYDATASTRUCT cpd; /*给COPYDATASTRUCT结构赋值*/
 cpd.dwData = 0;
 cpd.cbData = dProcessID;
 cpd.lpData = NULL;

 SendMessage( hWnd,WM_COPYDATA,NULL,(LPARAM)&cpd );
 Sleep( 1000 );
}

接收端:

DWORD ProcessID = pCopyDataStruct->cbData;

或者使用命令行:

CString strCommandLine = GetCommandLine();
 MessageBox( strCommandLine );

 


    
[3] Activity生命周期胪陈
    来源: 互联网  发布时间: 2014-02-18
Activity生命周期详述

activity是单独的,用于处理用户操作。几乎所有的activity都要和用户打交道,所以activity类创建了一个窗口,开发人员可以通过setContentView(View)接口把UI放到activity创建的窗口上,当 activity指向全屏窗口时,也可以用其他方式实现:作为漂浮窗口(通过windowIsFloating的主题集合),或者嵌入到其他的 activity(使用ActivityGroup)。大部分的Activity子类都需要实现以下两个接口:

  • onCreate(Bundle)接口是初始化activity的地方. 在这儿通常可以调用setContentView(int)设置在资源文件中定义的UI, 使用findViewById(int) 可以获得UI中定义的窗口.
  • onPause()接口是使用者准备离开activity的地方,在这儿,任何的修改都应该被提交(通常用于ContentProvider保存数据). 

为了能够使用Context.startActivity(),所有的activity类都必须在AndroidManifest.xml文件中定义有相关的“activity”项。

activity类是Android 应用生命周期的重要部分。

Activity生命周期

在系统中的Activity被一个Activity栈所管理。当一个新的Activity启动时,将被放置到栈顶,成为运行中的Activity,前一个Activity保留在栈中,不再放到前台,直到新的Activity退出为止。

Activity有四种本质区别的状态:

  • 在屏幕的前台(Activity栈顶),叫做活动状态或者运行状态(active or running)
  • 如果一个Activity失去焦点,但是依然可见(一个新的非全屏的Activity 或者一个透明的Activity 被放置在栈顶),叫做暂停状态(Paused)。一个暂停状态的Activity依然保持活力(保持所有的状态,成员信息,和窗口管理器保持连接),但是在系统内存极端低下的时候将被杀掉。
  • 如果一个Activity被另外的Activity完全覆盖掉,叫做停止状态(Stopped)。它依然保持所有状态和成员信息,但是它不再可见,所以它的窗口被隐藏,当系统内存需要被用在其他地方的时候,Stopped的Activity将被杀掉。
  • 如果一个Activity是Paused或者Stopped状态,系统可以将该Activity从内存中删除,Android系统采用两种方式进行删除,要么要求该Activity结束,要么直接杀掉它的进程。当该Activity再次显示给用户时,它必须重新开始和重置前面的状态。
  •      简言之:

         活动状态

                 Activity在用户界面中处于最上层,完全能被用户看到

         暂停状态

                Activity在界面上被部分遮挡,该Activity不再处于用户界面的最上层,且不能够与用户进行交互

         停止状态

               Activity在界面上被部分遮挡,该Activity不再处于用户界面的最上层,且不能够与用户进行交互

         非活动状态

                Activity在界面上完全不能被用户看到,也就是说这个Activity被其他Activity全部遮挡

        在以上三种状态中的Activity则处于非活动状态

          状态转换图

    下面的图显示了Activity的重要状态转换,矩形框表明Activity在状态转换之间的回调接口,开发人员可以重载实现以便执行相关代码,带有颜色的椭圆形表明Activity所处的状态。


    在上图中,Activity有三个关键的循环: 

  • 整个的生命周期,从onCreate(Bundle)开始到onDestroy()结束。Activity在onCreate()设置所有的“全局”状态,在onDestory()释放所有的资源。例如:某个Activity有一个在后台运行的线程,用于从网络下载数据,则该Activity可以在onCreate()中创建线程,在onDestory()中停止线程。
  • 可见的生命周期,从onStart()开始到onStop()结束。在这段时间,可以看到Activity在屏幕上,尽管有可能不在前台,不能和用户交互。在这两个接口之间,需要保持显示给用户的UI数据和资源等,例如:可以在onStart中注册一个IntentReceiver来监听数据变化导致UI的变动,当不再需要显示时候,可以在onStop()中注销它。onStart(),onStop()都可以被多次调用,因为Activity随时可以在可见和隐藏之间转换。
  • 前台的生命周期,从onResume()开始到onPause()结束。在这段时间里,该Activity处于所有 Activity的最前面,和用户进行交互。Activity可以经常性地在resumed和paused状态之间切换,例如:当设备准备休眠时,当一个 Activity处理结果被分发时,当一个新的Intent被分发时。所以在这些接口方法中的代码应该属于非常轻量级的。
  • Activity从创建到销毁有多种状态,从一种状态到另一种状态时会激发相应的回调方法,这些回调方法包括:

      onCreate 、onStart 、onResume 、onPause 、onStop 、onDestroy 、onRestart

      以图片的形式去记忆:



    不难看出,其实这些方法都是两两对应的,onCreate创建与onDestroy销毁;onStart可见与onStop不可见;onResume可编辑(即焦点)与onPause;这6个方法是相对应的,那么就只剩下一个onRestart方法了,这个方法在什么时候调用呢?
    答案就是:在Activity被onStop后,但是没有被onDestroy,在再次启动此Activity时就调用onRestart(而不再调用onCreate)方法;如果被onDestroy了,则是调用onCreate方法。

        1. 两个Activity的切换过程:

       Activity01 onPause->Activity02 onCreate->Activity02 onStart->Activity02 onResume->Activity01 onStop-> Activity01 onDestory Activity

       2. Activity启动时经历

            onCreate->onStart->onResume

      3. 从Activity执行BroadcastReceiver后,执行onPause->onStop 再返回本Activity会执行onStart->onResume


      4. onStart()和onStop()也经常被用来注册和注销BroadcastReceiver


      5. 点击系统menu菜单 或者返回键执行onPause->onStop

    下面再通过一个比喻来看两个Activity的切换过程。

      我们把Activity比作一本书,我们要看书,首先从书架上取出书(onCreate),然后放到桌上(onStart),接着打开书(onResume),这样我们就可以看书并可以在书本上写字了。

      如果这时候我们要启动另一个Activity,也就是要看另一本书,首先我们放下手中的笔或者说合上书(onPause),然后从书架上拿下另一本书(书2:onCreate),然后把书本2放到桌上并打开(书2:onStart、onResume)。

      如果书本1被书本2完全盖住了,即不可见了,就调用书本1的onStop;而如果书本2较小,没有完全盖住书本1,则不会调用。

      我们还可以把书本1放回书架上,即onDestroy。

      另外,还有一点要注意,Activity在处于onPause、onStop、onDestroy状态下,系统都可以销毁该Activity所在进程,所以我们在处理一些要保存的数据时,必须在onPause方法中进行,因为onStop和onDestroy方法不一定会被调用

    Activity的整个生命周期都定义在下面的接口方法中,所有方法都可以被重载。

    所有的Activity都需要实现 onCreate(Bundle)去初始化设置,大部分Activity需要实现onPause()去提交更改过的数据,当前大部分的Activity也需要实现onFreeze()接口,以便恢复在onCreate(Bundle)里面设置的状态。

    public class Activity extends ApplicationContext {

    protected void onCreate(Bundle icicle);

    protected void onStart();

    protected void onRestart();

    protected void onResume();

    protected void onFreeze(Bundle outIcicle);

    protected void onPause();

    protected void onStop();

    protected void onDestroy();

    }


    ------本文从网上收集整理


    —— —— —— EOF —— —— ——

    作者: Once-ler| http://blog.csdn.net/wirelessqa
    邮箱: wirelessqa.me@gmail.com
    微博: http://weibo.com/wirelessqa  
    转载请注明来源: Once-ler — http://blog.csdn.net/wirelessqa

     

        
    最新技术文章:
    ▪Android开发之登录验证实例教程
    ▪Android开发之注册登录方法示例
    ▪Android获取手机SIM卡运营商信息的方法
    ▪Android实现将已发送的短信写入短信数据库的...
    ▪Android发送短信功能代码
    ▪Android根据电话号码获得联系人头像实例代码
    ▪Android中GPS定位的用法实例
    ▪Android实现退出时关闭所有Activity的方法
    ▪Android实现文件的分割和组装
    ▪Android录音应用实例教程
    ▪Android双击返回键退出程序的实现方法
    ▪Android实现侦听电池状态显示、电量及充电动...
    ▪Android获取当前已连接的wifi信号强度的方法
    ▪Android实现动态显示或隐藏密码输入框的内容
    ▪根据USER-AGENT判断手机类型并跳转到相应的app...
    ▪Android Touch事件分发过程详解
    ▪Android中实现为TextView添加多个可点击的文本
    ▪Android程序设计之AIDL实例详解
    ▪Android显式启动与隐式启动Activity的区别介绍
    ▪Android按钮单击事件的四种常用写法总结
    ▪Android消息处理机制Looper和Handler详解
    ▪Android实现Back功能代码片段总结
    ▪Android实用的代码片段 常用代码总结
    ▪Android实现弹出键盘的方法
    ▪Android中通过view方式获取当前Activity的屏幕截...
    ▪Android提高之自定义Menu(TabMenu)实现方法
    ▪Android提高之多方向抽屉实现方法
    ▪Android提高之MediaPlayer播放网络音频的实现方法...
    ▪Android提高之MediaPlayer播放网络视频的实现方法...
    ▪Android提高之手游转电视游戏的模拟操控
     


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3