mikebai.com

  • Home
  • dev
  • DotNET
  • M365
  • 搞笑
  • 杂七杂八
  • FocusDict
dev
dev

对android的android:taskAffinity初识

android中AndroidManifest.xml文件, activity标签中有一个属性为android:taskAffinity=“String”。 如果不设置此属性,默认一个应用程序只有一个栈,这个栈以应用包命为单位。 下面是我做的三个实验: 1、新建两个工程,application01和application02 application01设置 android:taskAffinity="aaa.aaa" android:allowTaskReparenting="true" application02也设置 android:taskAffinity="aaa.aaa" android:allowTaskReparenting="true" 先运行application01,然后点击home键,让application01运行在后台,再运行application02,现在按返回键,当前显示的是application01的mainActivity,再点返回键,回到home页。 但是长按home键,发现运行过的程序只有application01。   2、紧接着又在此基础上做了另外一个实验,在application01上新建一个secondActivity,设置 android:taskAffinity="aaa.bbb" android:allowTaskReparenting="true" 在mainActivity中startActivity时,设置Intent中flag属性为FLAG_ACTIVITY_NEW_TASK,注意,这里的flag属性必须为new task。 然后运行application01,点击进入secondActivity,点击home键,让程序回到后台, 然后运行application02,点击返回,当前显示的application01中的mainActivity,再点击返回,显示的是application01中secondActivity,跟预期一致。 3、在此基础上堆application01再次修改,增加thirdActivity,设置属性android:taskAffinity="aaa.aaa" android:allowTaskReparenting="true" 并在secondActivity中startActivity时,设置Intent中flag属性为FLAG_ACTIVITY_NEW_TASK; 运行application01,点击进入secondActivity,再进入thirdActivity,点击返回,回到mainActivity,在点击返回,回到secondActivity,再点击返回,回到home页面,跟预期一致。

2012-01-11 0comments 108hotness 0likes mikebai Read all
dev

android Activity类的使用

今天我谈谈Activity这个类吧(对于开发环境的一些配置情况,请大家参看google发布的那个文档吧,那里已经写得很清楚了,各种工具的下载链接也都很齐全),以后我还会陆续发表一些文章贡大家参考(我的QQ:83961879,加我时注明android). 在android开发中Activity非常重要,在一个应用中,每一个显示的屏幕都是一个Activity.所以学习android,必须要对Activity有一定的了解.在其他论坛中也有一些关于Activity的介绍,我在这里就想谈谈我对Activity学习的一些看法.首先Activity的生命周期很重要,Activity主要包含六个方法,分别是onCreate,onStart,onResume,onPause,onStop,onDestory. onCreate和onDestory对应.onStart和onStop对应,onResume和onPause对应. 这几个函数大概是这样定义的,当启动一个Activity的时候,onCreate方法首先会被启动,然后接着是onStart和onResume,也会启动,一般地,等这几个函数都启动完了之后你这个Activity就可以被显示出来了.当然我这里说的是一般的情况,如果你要是在这三个函数初始化的时候启动了一个后台的Service,那么还要等待ServiceConnection执行完毕才能够被显示出来,这里可能有人要问什么是Service了,在以后我会介绍它,这里大家就先了解下Service的回调函数也会影响Acitivity的启动就可以了.这是Activity启动时会调用的三个函数,在Acitivity销毁的时候会调用onPause,onStop,onDestory.当调用完onDestory之后,你的Acitivity也就被销毁完毕了,这时候你在调用Activity的isFinishing的时候,就会返回true,但是此时Activity的this指针还可以被使用,如果你在Activity单起一个线程做其他事情的话,那么上下文变量context指针还是能够被使用的.      当然Activity有可能还处于其他状态,不一定就是被显示或者被销毁,很有可能这个Activity启动了另一个Activity,这个时候前先的那个Activiy就会被放到系统的堆栈中,等被启动的Activity返回的时候,它又重新被显示出来,这个流程是这样的,一个Activity启动了另外的一个Activity,那么它就会调用onPause函数,进入一种停滞的状态,然后被启动的Activity被销毁返回后,又会调用onResume函数.对于Activity的这种机制,我感觉在初始化的工作最好放到一个自己定义的一个接口中,因为由于Activity状态的改变,你的Activity的Layout就有可能会被改变.说到这里就要谈一下什么叫做Layout,每个Activity的界面的布局就是一个Layout,每个Activity都要有这样一个布局它才能够被显示出来,一般地,我们都会把一个Layout放到一个XML文件当中,然后直接调用Activity的setContentView函数来填充这个Activity,如果Layout不放在xml文件中,也可以用代码生成一个动态的Layout,也就是说用Activity.this指针生成一个Layout.这个给大家推荐一个非常好用的工具叫做droiddraw,论坛里就有链接,站长好像发过贴.这个工具非常好用,不用看教程半小时就能学会,上面有一些特定的控件,把控件摆好布局后直接能生成xml文件.把这个xml文件放到项目的res/layout文件夹下面就可以了.生成好Layout文件后,你就要为你程序要用到的一些控件设定ID,具体怎么设定大家可以在google的android主页里有,叫gettingstarted,那个写得很明白,我就不跟这里重述了.接下来还是谈下android的这几个主要的函数,我还有些建议就是在onCreate函数中尽量少写代码,把尽肯能多的东西放到onResume和那个自定义的初始化函数里去写,onResume这个函数被调用的几率是非常高的,这里大家在模拟器上开发可能没有感觉到onResume的重要性,在真机上测试就会发现,当屏幕变黑进入等待状态,然后你手动恢复屏幕变亮时也会进入onResume状态,所以我感觉把一些刷新控件的方法放到onResume函数中来做还是非常必要的.onPause,onStop,还有onDestroy函数都是用来做一些清理工作的,比如说一些变量要被释放,一些线程要被停滞等等都可以放到这里来做. 下面我来总结一下Activity一个大概的设计思路: 首先设计一个方法,这个方法主要作用就是初始化Activity的控件,进行各种条件判断,对Acitvity来进行不用的布局初始化,这里举个例子来解释下为什么要初始化不同的布局,例如你的这个Activity从SD卡读取了一些信息,那么当你拔出SD卡的时候这些信息肯定也就没有了,那么你就要进行另外的一个布局来显示这个Activity,这个时候你就可以重用这个函数来进行布局的初始化. onCreate函数:注册你要用到的变量,比如说service,receiver,这些变量是无论你的Activity是在前台还是在后台都能够被响应到的,然后调用上面那个用来初始化的函数初始化布局信息. onStart函数:注册一些变量.这些变量必须在Activity在前台的时候才能够被响应. onResume函数:调用一些刷新UI的函数,每当Activity调用到这里时就要刷新一下UI各控件的状态. onPause函数:一般是做一些变量的设置,因为这个时候Activity马上就要切到后台处理,可能有些变量就要被释放掉或者状态要做些相应的调整. onStop函数:反注册在onStart函数中注册的变量. onDestory函数:反注册在onCreate函数中注册的变量. 上面谈了些Activity的最常用的一些方法,当然还有很多方法没有谈到,有很多方法我也没有用过,其他方法大家可以参考google的文档. 接下来我来谈谈Activity中最简单的一些通信方法,这里我先定义两个名字为方便接下来的叙述,启动另外一个Activity的那个Activity我们称之为主Activity,被启动的那个Activity我们称之为子Activity. 主Activity和子Acitivity通信的方式有很多种这里介绍两种最简单的方法。 方法一:通过Intent来进行参数的传递,在Intent中有各种putXXX方法来存放各种参数,然后在子Activity接收到这个Intent时能够从这个Intent里取出这个参数,利用getIntnet().getXXXExtra()方法就可以了. 方法二:当一个主Activity想从一个子Activity接受消息时可以使用StartActivityforResult方法,例如这样启动一个Activity,startActivityForResult(i, REQUEST_CODE); 然后在主Activity中的onActivityResult方法对requestCode进行判断来对子Activity不同的返回处理不同的情况,另外子Activity也可以利用setResult方法来设置主Activity方法中的resultCode,这样主Activity也可以根据子Activity的不同的resultCode来处理不同的情况. 今天就先写这么多吧,有什么问题大家加我QQ,可以详谈. 我在补充两句:现在android好像很少有中文资料,一般都要看google的英文文档来学习, 如果你要是对java理解比较深的话,那么我觉得android应用程序还是很容易上手的.

2012-01-08 0comments 124hotness 0likes mikebai Read all
dev

Android Activity生命週期簡介

前面有提到何謂Activity: 最簡單的就是把Activity看成一個User Interface Program. 它會提供使用者一個互動式的介面功能. 當然一個activity通常不只一個UI, 所有的Activity在系統裏由Activity stack 所管理, 當一個新的Activity被執行後,它將會被放置到stack的最頂端,並且變成"running activity", 而之前的Activity原則上還是存在stack中,但不會是在foreground(前景)的情況. 一個Activity基本上有四個狀態 Active, Paused, Stopped, Dead: Active (活動):Active狀態是使用者啟動Application 或 Activity 後,Activity 在運行中的狀態.在 Android 平台上, 一個時刻只會有一個 Activity 處於Active 或 Running 狀態。其他的 Activity 都處於未Dead, Stopped 或是Paused 的狀態. Paused (暫停)Paused狀態是當 Activity 暫時暗下來, 退到背景畫面的狀態. 例如當電話來時, 原本運行的 Activity 退到背景畫面. 新出現的介面元件蓋住了原來的 Activity 畫面.Activity 處在Paused狀態時, 使用者無法與原來的 Activity 互動. Stopped (停止)Stopped狀態是有其他 Activity 正在執行, 而這個 Activity 已經離開螢幕, 不再動作的狀態.透過長按Home鍵, 可以叫出所有處於Stopped狀態的Application List(應用程式列表).在Stopped狀態的 Activity,還可以透過 Notification 來喚醒。以後再說明 Notification. Dead/Inactive (已回收或未啟動)Dead狀態是 Activity 尚未被啟動, 已經被手動終止, 或已經被系統回收的狀態.要手動終止 Activity, 可以在程式中呼叫 finish 函式.如果是被系統回收, 可能是因為記憶體不足, 系統根據記憶體不足時的回收規則, 將處於Stopped狀態的 Activity 所佔用的記憶體回收. 下面的流程圖說明一個Activity運行的情況, 長方形代表callback methods(回呼函式), 可以做出想要處理的事情, 有顏色的部份就是實際Activity會處於的狀態. 上圖有三個主要 lifetime : 1. Entire lifetime: 一個Activity的Entire lifetime是由onCreate()開始, 一直到onDestroy()結束.一個Activity可以把所有的資源設定寫在onCreate中, 一直到onDestroy()時再釋放出來. 2. Visible lifetime: 一個Activity的Visible lifetime是指在onStart()到onStop()之間. 在這段時間內,使用者可以在螢幕上看見Activity, 要注意這個"Visible"是個形容, Activity不見得一定在foreground(前景)跟使用者直接互動. 3. Foreground lifetime: 一個Foreground lifetime 指 onResume() 到 onPause() 之間. 這個時期的Activity是在其他的Activity的前面, 且可以直接跟使用者進行互動. 所以這段時期指的就是圖中的Activity is running. 簡單的總結幾個動作:onCreate()用來做程式的初使化動作; onDestory()通常都拿來把onCreate()時的資料做釋放的動作;onPause()時把需要保存的資料保存; onResume()把保存的資料拿回來使用. 再歸納一般 Android Application遵循的動作流程: 一般啟動:onCreate -> onStart -> onResume 啟動一個 Activity 的基本流程是: 分配資源給這個 Activity(onCreate), 然後將 Activity 內容顯示到螢幕上(onStart), 在一切就緒後, 取得螢幕的控制權(onResume), 使用者可以開始使用這個程式。 呼叫另一個 Activity: onPause(1) -> onCreate(2) -> onStart(2) - onResume(2) -> onStop(1) 先凍結原本的 Activity, 再交出直接存取螢幕能力(onPause )的過程. 直到 Activity 2 完成一般啟動流程後, Activity 1 才會被停止. 回復原 ActivityonPause(2) -> onRestart(1) -> onStart(1) -> onResume(1) -> onStop(2) -> onDestroy(2) 按 Back鍵可以回到原本的 Activity。 退出/結束onPause -> onStop -> onDestroy 如果程式中有直接呼叫 finish 函式來關閉 Activity的話, 系統會暫停(Pause), 停止(Stop)然後銷毀(Destroy)。 回收後再啟動 onCreate -> onStart -&g

2012-01-07 0comments 125hotness 0likes mikebai Read all
dev

Photoshop初级教程:凹凸文字效果

本Photoshop初级教程详细讲解如何用Photoshop制作凹凸文字效果,涉及到了的图层混合选项,特别适合Photoshop初学者和新入行的设计师。 这篇Photoshop初级教程教一些新的设计师朋友如何简单轻松制作一个漂亮的凹凸文字效果(inset text effect),又叫凸版印刷(letterpress)文字效果。下图是最终效果: 1.创建Photoshop文档 首先创建一个Photoshop空白文档。打开Photoshop,按Ctrl+N新建文档,这里我们用小画布,设成550px×550px,当然可以随时调节画布大小。 2.制作背景图片 1)我们要创建一个用渐变做的背景。新建图层,或者将原来的背景图层解锁(只要双击原来的背景图层),接着弹出如下图的对话框,将它名字改成background,点击确定。 2)双击刚才的背景图层,打开Photoshop图层混合选项。用图层混合选项做渐变比直接用Photoshop渐变工具要方便许多,而且可以很容易地更改效果。 我们想要创建一个从亮到暗的垂直渐变,参考颜色:亮蓝(#448CCB),暗蓝色(#003471)。如下图: 点击颜色条,弹出如下图的选择颜色的对话框,选择我们的参考颜色,你可以通过拉动中间的滑块控制明暗的比例。 3)渐变完成了,但色彩不够丰富,我们要为背景增加一盏“灯”来丰富色彩。 选择Photoshop的画笔工具,选择一个大的笔刷,降低硬度、透明度和流量(如果你有数位板更好控制),如下图: 按住Ctrl+Shift+N来创建一个新的图层,命名为background light。将前景色设为白色,用笔刷在左上角点击。效果如下图: 3.创建凹凸文字 1)用Photoshop的文字工具创建一些示例文字,选择一些比较粗的字体效果会更好。而且文字尺寸也要大一些,这里设置成30px(Photoshop默认文字单位是pt,可以通过选项更改成px)。 2)现在我们要将文字和Photoshop画布对齐起来(译者:令我惊奇的是,很多使用经常使用Photoshop的人甚至不知道如何对齐。) 确保先选择文字图层,然后按Ctrl+A选中所有,接着到Photoshop菜单 :图层(Layer) >对齐图层( Align Layers to Selection) > 垂直居中(Vertical Centers),垂直对齐后,在同样菜单下点水平居中(Horizontal Centers)。或者可以直接点击Photoshop菜单栏下的几个对齐图标,这样操作更快捷。 3)下面我们开始为文字做凹凸效果,同样还是用Photoshop的图层混合选项。这里会用到三种效果:投影、内阴影和渐变叠加。双击文字图层进入Photoshop图层混合选项。 打开Photoshop图层混合模式后先在左边选中渐变叠加,同样我们要让文字也从上到下逐渐变暗,同时文字的颜色整体上要比背景稍

2012-01-03 0comments 105hotness 0likes mikebai Read all
dev

au is01日文版 市场打开错误

去设置里面把市场卸载. 「設定  -->  アプリケーションの管理  -->  マーケット→マーケット  -->  アンインストール」 即可还原成原始的市场app.打开后问题解决

2011-12-23 0comments 108hotness 0likes mikebai Read all
dev

远程主机强迫关闭了一个现有的连接,Connection attempts...

最近eclipse插上真机老是出下面的错误. 远程主机强迫关闭了一个现有的连接,Connection attempts...Adb connection Error 网上说的adb kill-server 然后再adb start-server 再重启eclipse.貌似很多都是转来转去的. 试了几次,发现我问题依旧.. 咕咕噜了一下,发现用下面文章提到的patch adb的方法可以解决发上来希望对大家有所帮助吧 http://code.google.com/p/android/issues/detail?id=12141 文章里面有2个下载链接,第一个稍旧 1.0.26 version (实测可正常使用)http://android.googlecode.com/issues/attachment?aid=8293722374312378755&name=adb.exe&token=DuX2HnbOsaAt_F251Ak_t31Q1RI%3A1324311316026version of adb (1.0.29) --诺顿提示需要注意http://android.googlecode.com/issues/attachment?aid=121410050000&name=adb.exe&token=BQatcvFvTG-erMhohbajbbRAP3M%3A1324311316037 下载后覆盖android-sdk\platform-tools原来的adb.exe文件即可  

2011-12-20 0comments 112hotness 0likes mikebai Read all
dev

Android高手进阶教程(九)之----Android Handler的使用!!!

大家好我们这一节讲的是Android Handler的使用,在讲Handler之前,我们先提个小问题,就是如何让程序5秒钟更新一下Title. 首先我们看一下习惯了Java编程的人,在不知道Handler的用法之前是怎么样写的程序,代码如下所示:   package com.android.tutor;   import java.util.Timer;   import java.util.TimerTask;   import android.app.Activity;   import android.os.Bundle;   public class HandlerDemo extends Activity {              //title为setTitle方法提供变量,这里为了方便我设置成了int型       private int title = 0;              public void onCreate(Bundle savedInstanceState) {           super.onCreate(savedInstanceState);           setContentView(R.layout.main);                      Timer timer = new Timer();           timer.scheduleAtFixedRate(new MyTask(), 1, 5000);       }                  private class MyTask extends TimerTask{           @Override           public void run() {                              setTitle("Welcome to Mr Wei's blog " + title);               title ++;           }          }   }   然而当我们执行程序,并不能达到我们预期的效果,所以Android 引进了Handler 这个特殊的类,可以说它是Runnable和Activity交互的桥梁

2011-12-19 0comments 110hotness 0likes mikebai Read all
dev

深入理解Android消息处理系统——Looper、Handler、Thread

     熟悉Windows编程的朋友可能知道Windows程序是消息驱动的,并且有全局的消息循环系统。而Android应用程序也是消息驱动的,按道理来说也应该提供消息循环机制。实际上谷歌参考了Windows的消息循环机制,也在Android系统中实现了消息循环机制。Android通过 Looper、Handler来实现消息循环机制,Android消息循环是针对线程的(每个线程都可以有自己的消息队列和消息循环)。本文深入介绍一下 Android消息处理系统原理。     Android系统中Looper负责管理线程的消息队列和消息循环,具体实现请参考Looper的源码。 可以通过Loop.myLooper()得到当前线程的Looper对象,通过Loop.getMainLooper()可以获得当前进程的主线程的 Looper对象。     前面提到Android系统的消息队列和消息循环都是针对具体线程的,一个线程可以存在(当然也可以不存在)一个消息队列和一个消息循环(Looper),特定线程的消息只能分发给本线程,不能进行跨线程,跨进程通讯。但是创建的工作线程默认是没有消息循环和消息队列的,如果想让该线程具有消息队列和消息循环,需要在线程中首先调用Looper.prepare()来创建消息队列,然后调用Looper.loop()进入消息循环。如下例所示: class LooperThread extends Thread { public Handler mHandler; public void run() { Looper.prepare(); mHandler = new Handler() { public void handleMessage(Message msg) { // process incoming messages here } }; Looper.loop(); } } 这样你的线程就具有了消息处理机制了,在Handler中进行消息处理。      Activity是一个UI线程,运行于主线程中,Android系统在启动的时候会为Activity创建一个消息队列和消息循环(Looper)。详细实现请参考ActivityThread.java文件。      Handler的作用是把消息加入特定的(Looper)消息队列中,并分发和处理该消息队列中的消息。构造Handler的时候可以指定一个Looper对象,如果不指定则利用当前线程的Looper创建。详细实现请参考Looper的源码。      Activity、Looper、Handler的关系如下图所示:      一个Activity中可以创建多个工作线程或者其他的组件,如果这些线程或者组件把他们的消息放入Activity的主线程消息队列,那么该消息就会在主线程中处理了。因为主线程一般负责界面的更新操作,并且Android系统中的weget不是线程安全的,所以这种方式可以很好的实现Android界面更新。在Android系统中这种方式有着广泛的运用。      那么另外一个线程怎样把消息放入主线程的消息队列呢?答案是通过Handle对象,只要Handler对象以主线程的Looper创建,那么调用 Handler的sendMessage等接口,将会把消息放入队列都将是放入主线程的消息队列。并且将会在Handler主线程中调用该handler 的handleMessage接口来处理消息。      这里面涉及到线程同步问题,请先参考如下例子来理解Handler对象的线程模型: 1、首先创建MyHandler工程。 2、在MyHandler.java中加入如下的代码:package com.simon; import android.app.Activity; import android.os.Bundle; import android.os.Message; import android.util.Log; import android.os.Handler; public class MyHandler extends Activity { static final String TAG = "Handler"; Handler h = new Handler(){ public void handleMessage (Message msg) { switch(msg.what) { case HANDLER_TEST: Log.d(TAG, "The handler thread id = " + Thread.currentThread().getId() + "\n"); break; } } };

2011-12-19 0comments 110hotness 0likes mikebai Read all
dev

eclipse起始环境配置总结~(修改Ctrl+鼠标左键 etc)

在用Eclipse的时候,尤其是在使用Ctrl+c Ctrl+v 时,有时会不小心会连按到鼠标2下,这时候Eclipse会自动切换到到跟当前代码相关联的文件中去。如果文件较大(例如:struts-tags.tld)这样的文件。。。那么会卡在那里10几秒。。。 取消该功能方法如下: 选择【Window】菜单Preferences ——>General——>Editors——>Text Editors——>Hyperlinking 然后取消或者将默认的Ctrl改成其他快捷键(例如:ALT)    //*****************************自动缩进:Ctrl+i,对选中的代码自动缩进,与代码对齐不同,这个不会自动在分号后换行,不适用Aptana定位到最后编辑的行:Ctrl+Q 这个真的很好用,尤其是对我这种记性差,常要翻上翻下看变量名,类名的名 //*****************************取消拼写错误检错在   window   -   Preferences   左侧的   General   -   Editors   -  Text Editors   -   Spelling   下的选项中 去掉   Enable   spell   checking   选项//*****************************显示行号1.在Editor的最左边(设置断点的地方)点右键,出现的快捷菜单如上;2.依次点击Window->Preferences->Gerenal->Editors->Text Editors然后在show line number复选框打对号即可。 //*****************************XML文件格式化设置-->每个属性设置占一行 进入 Window/Preferences,展开到 XML/XML Files/Editor, 勾选 “Split multiple attributes each on a new line”    

2011-12-08 0comments 108hotness 0likes mikebai Read all
dev

升级到adt15.0后,出现conversion to dalvik format failed with error 1

升级SDK Tool r14 和 ADT 15后,在导出签名apk时遇到了这样的问题: conversion to dalvik format failed with error 1。  (主要原因应该是SDK升级的原因, 单单升级ADT没有遇到问题) 如图: Refresh、Clean都试过了,还是不行。 最终的解决办法是,去除了project.properties文件(原default.properties)中的proguard配置。 view plaincopy to clipboardprint? # This file is automatically generated by Android Tools.   # Do not modify this file -- YOUR CHANGES WILL BE ERASED!   #   # This file must be checked in Version Control Systems.   #   # To customize properties used by the Ant build system use,   # "ant.properties", and override values to adapt the script to your   # project structure.      # Project target.   target=android-7      #删除下面这行就ok了   #proguardproguard.config=proguard.cfg   # This file is automatically generated by Android Tools. # Do not modify this file -- YOUR CHANGES WILL BE ERASED! # # This file must be checked in Version Control Systems. # # To customize properties used by the Ant build system use, # "ant.properties", and override values to adapt the script to your # project structure. # Project target. target=android-7 #删除下面这行就ok了 #proguard.config=proguard.cfg 上面这种解决方式不太靠谱,毕竟大家还是要混淆代码的,所以说一下另一个解决办法,那就是升级Proguard。目前最新的proguard是4.7版,我这边升级到Proguard4.6就OK了。从proguard官网下载4.6的,覆盖到tools/proguad/bin、lib这两个文件夹就OK了.我这边是这样解决的。下载地址: http://sourceforge.net/projects/proguard/files/proguard/4.6/

2011-12-08 0comments 117hotness 0likes mikebai Read all
1…1516171819…25

Recent Posts

  • c# winform适配高dpi
  • com.microsoft.sqlserver.jdbc.SQLServerException “trustServerCertificate”属性设置为“false”,但驱动程序无法使用安全套接字层 (SSL) 加密与 SQL Server建立安全连接
  • java -cp 用法介绍
  • HTML 容器元素
  • MVC的cshtml的介绍

Recent Comments

No comments to show.

COPYRIGHT © 2025 mikebai.com. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang