mikebai.com

  • Home
  • dev
  • DotNET
  • M365
  • 搞笑
  • 杂七杂八
  • FocusDict
個人BLOG
it developer
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 99hotness 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 99hotness 0likes mikebai Read all
DotNET

.NET メモ

①二重ログイン 前ユーザのセッションをクリアすること http://stackoverflow.com/questions/6840322/can-we-end-other-users-session http://www.velocityreviews.com/forums/t108001-how-can-we-terminate-a-users-session.html セッション アクセス http://forums.asp.net/t/1611102.aspx/1/10 http://stackoverflow.com/questions/7204039/is-it-possible-that-user-session-states-might-overlap-resulting-in-one-user-rea http://www.eggheadcafe.com/articles/20030418.asp   ② IE无解,参考下面的URLhttp://www.velocityreviews.com/forums/t75622-disable-forecolor.html         //disable        protected void Button1_Click(object sender, EventArgs e)        {            this.DropDownList1.Enabled = false;            this.DropDownList1.Style[HtmlTextWriterStyle.BackgroundColor] = "#00CCFF";        }         //enable        protected void Button2_Click(object sender, EventArgs e)        {            this.DropDownList1.Enabled = true;            this.DropDownList1.Style[HtmlTextWriterStyle.BackgroundColor] = null;        }  

2011-12-16 0comments 99hotness 0likes mikebai Read all
DotNET

IIS7.5配置

第一步,进入控制面板,点击程序图标 第二步,点击打开或关闭Windows功能 第三步,勾选Internet信息服务全部功能,或根据需要,点击确定,安装 第四步,进入控制面板,点击管理工具 第五步,点击Internet 信息服务(IIS)管理器 第六步,点击ASP,将启用父路径设为True 第七步,点击默认文档,根据需要添加   第八步,失效,不需要设置 第九步,点击默认网站,然后点击右边的基本设置,选择自己网站所在目录 第十步,进入C:\Windows\ServiceProfiles\NetworkService\AppData\Local\,设置Temp文件夹的安全属性。右键点击属性—安全—编辑—添加 第十一步,点击立刻查找,然后点击Authenticated Users—确定—添加—确定   其他问题 IIS7错误:服务器配置为将传递身份验证和内置帐户一起使用,以访问指定的物理路径... IIS7配置完后,总是提示HTTP500内部服务器错误,启用调试属性显示详细错误信息后,发现错误提示如下:错误摘要HTTP 错误 500.19 - Internal Server Errorweb.config 文件的 system.webServer/httpErrors 节中不允许绝对物理路径“C:\inetpub\custerr”。请改用相对路径。点击IIS管理器右边的“基本设置”,然后单击“测试连接”,发现有“授权”错误提示,详细信息提示为:服务器配置为将传递身份验证和内置帐户一起使用,以访问指定的物理路径。但是,IIS 管理器无法验证此内置帐户是否有访问权。请确保应用程序池标识具有该物理路径的读取访问权。如果此服务器加入到域中,并且应用程序池标识是 NetworkService 或 LocalSystem,则验证<domain>\<computer_name>$ 具有该物理路径的读取访问权,然后重新测试这些设置。 图1 IIS7授权错误提示 原因与解决方法:通过反复测试后发现,这里是物理路径读取访问权限的问题,我们只需要修改“路径凭据”的验证方式,改为“特定用户”并将特定用户设为管理员的账号即可。比如输入账号为:administrator,密码为该账号的登录密码。如果该账号没有设置密码,这里是确定不了的,所以你可以去控制面板给该账号设置一个密码。具体操作如图2所示。 图2 更改IIS7“连接凭据”为特定管理员账号 (提示:系统有密码时,有的人不喜欢每次打开电脑都需要登录,这个问题你只需要使用一个微软提供的自动登录小工具即可轻松解决。该小工具为Autologon.exe,具体介绍及下载可参考这里:windows系统自动登录小工具Autologon: http://www.zhiwenweb.cn/article.asp?id=1242)如此简单的设置完后,你就发现问题得到解决了。如图3所示。 图3 iis7授权错误得到解决 设置应用池 打开当前网站所指定的应用池,将"托管管道模式"设置为"经典" 2012年02月14日追记 1)使用4.0框架开发的网站,在执行完上述操作后,可能会出现以下错误 Description of HRESULT: The page you are requesting cannot be served because of the ISAPI and CGI Restriction list settings on the Web server. 解决方法,进入iis 点击根目录(最最上面的server节点,不是某个网站的根节点),双击打开ISAPI and CGI Restrictions.将被禁止的4.0选项打开即可2)远程连接无效的问题防火墙端口没有开放导致无法远程访问在控制面板中,打开防火墙,高级,受信规则 ,添加规则,增加你网站的端口号即可。具体详细的规则设置等,就看需求了,这里就不多说了。  

2011-12-10 0comments 96hotness 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 97hotness 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 107hotness 0likes mikebai Read all
dev

AdMob相关知识(日文版本)

AdMobへの登録方法 まずは、AdMobのサイトへ行きます。AdMob 「今すぐスタート」というボタンがあるので、それをクリックします。すると、あなたの情報を登録する画面が表示されます。メールアドレス、パスワード、お名前、住所などを入力して、「同意します」のチェックを入れて「Submit」ボタンを押すだけです。AdMobのサービス使用条件とプライバシーポリシーは、英語で書かれてるんですよね…。一応、目は通しておいた方がいいと思います。私はあまり気にしませんでしたが。 クリック報酬型なので、Google Adsenseと同じような規約なのかなと思いますが、特に気をつけておいた方がいいのは、以下のような内容です。・自分でクリックしない。・人に頼んでクリックさせない。・クリックはこちら!とか書いて誘導しない。・これはおそらくですが、アダルト系のコンテンツではNGだと思います。私はしません。 すると、登録したメールアドレスに、AdMobからメールが送られてきますので、そのメール内のURLをクリックするだけで、とりあえず本登録は完了です。 PayPalへの登録 AdMobの広告収入の報酬受取りには、「小切手」か「PayPal」、どちらかしか選択できません。これがちょっとメンドクサイですね。どちらがいいかは、個人の自由ですが、「小切手」は、換金時に手数料が余計に掛かるというイメージ(思い込みかもしれません。)があったので、私は「PayPal」にしました。PayPalのアカウントをお持ちでない方は、PayPalへの登録も必要になります。 PayPalとは、世界中で使われているオンライン決済システムで、ネットバンクみたいなもんです。PayPalのサイトは下記です。PayPalのサイト「新規登録」というリンクがあるので、そこから登録が出来ます。「パーソナル」「ビジネス」「プレミア」とありますが、とりあえず私は個人で登録したかったので、「パーソナル」にしました。会社名義であれば「ビジネス」とするんでしょうね。PayPalへの登録時も、メールアドレス、住所、名前等を入力するだけで、すぐにアカウントが作れます。(クレジットカード番号を登録する事もできるんですが、私は登録していません。) AdMobの支払い情報の設定 それでは次は、AdMobの報酬をどうやって受け取るのかを設定します。AdMobへログインして、「アカウント」->「支払い情報」を選択してください。この画面で、報酬の受取方法を設定します。「国」は「日本」ですね。あなたが日本人なら。「アカウントの種類」は、個人名義でやるのなら「個人」、法人なら「法人」です。「商号」は、個人ならフルネームを、法人なら会社名になるんですかね。もしわからない場合は、AdMobへ聞いてみるといいと思います。 「納税者ID」は、記入不要です。 支払い情報のラジオボタンで、「小切手」か「PayPal」かを選択します。PayPalの場合、入力するのは、PayPalのログイン名だけです。PayPalのログイン名は、PayPalへログインするときに使うメールアドレスでいいです。これはAdMobに直接確認したので、間違い無いです。 以上で、AdMobの初期登録は完了です。あとは、広告を掲載するAndroidアプリケーションを追加していくんですが、AdMobへAndroidアプリを登録する手順は、「AdMobへのAndroidアプリの登録とSDKのダウンロード方法」をご覧下さい。   AdMobへAndroidアプリケーションを登録 まずはAdMobへ、広告を掲載したいAndroidアプリケーションを登録します。AdMobへログインして、「サイト及びアプリケーション」->「サイト/アプリケーションの追加」を選択します。(下図参照) すると、以下のような画面が表示されますので、「Androidアプリケーション」を選択します。 すると、以下のように、Androidアプリの情報を入力する画面が開きます。「App名」にはアプリケーション名を入れます。「AndroidパッケージURL」は、以下のいずれかです。「market://details?id=<packagename>」もしくは 「http://」Androidマーケットに登録しているのであれば、前者の「market://」を、そうでない場合は、単に「http://」とだけ入力すればOKです。私はまだAndroidマーケットに登録してませんので、「market://」の仕様をよく知らないんですが、またわかったら更新しておきます。 「ジャンル」は、選択肢の中から、Androidアプリのジャンルを選択します。「Appの説明」は、そのAndroidアプリの概要を入力します。 各項目の入力が済んだら、「次へ」ボタンを押します。これで、AdMobへのAndroidアプリの登録は一応完了です。以下のような画面が表示されます。 この画面で、AdMob Android SDKのダウンロードと、SDKの説明書がダウンロードできます。「AdMob Android SDKのダウンロード」ボタンを押して、AdMob Android SDKをダウンロードしましょう。内容は、Androidアプリのプロジェクトに組み込む「admob-sdk-android.jar」と、サンプルアプリのプロジェクトと、javadocが格納されています。また、「AdMob Android SDKのダウンロード」ボタンの下にあるPDFファイルのリンクも押して、PDFファイルもついでにダウンロードしておきましょう。説明書もjavadocも英語ですけど・・・。 この画面でダウンロードしておかないと、後でダウンロードできません。いや、出来るんですが、別のAndroidアプリを、これまでの手順をもう一回行って登録して、この画面を表示させないとダウンロードが出来ないんです。なんて不親切な・・・、と思いましたが仕方ありません…。 ちなみに、複数のAndroidアプリを登録する事も当然出来ますが、そのたびに、AdMob Android SDKをダウンロードする必要はありません。どのアプリの登録完了画面でダウンロードしたAdMob Android SDKも、中身は全く同じです。別々のアプリの登録後にダウンロードしたファイルを比較したので、間違いないです。(とあるサイトでは、アプリ毎にSDKの中身が違うと取れる表現もありましたが。) これでAndroidアプリに、AdMob広告を埋め込む前準備はOKです。次回は、実際にAndroidアプリにAdMob広告を埋め込む手順を紹介したいと思います。  

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

奇怪的String.getBytes("Unicode")

最近在进行联网测试的时候, 客户端:symbian 服务器:java 因为在symbian中,中文是用unicode进行编码的 于是在接收和发送的时候,都必须进行bytes的转换 当我用String.getBytes("Unicode"),进行转换时,总发现客户端发送给服务器的数据总无法被服务器unicode编码 同事服务器发送的数据给客户端,客户端也不能正常的识别 后来当我用String.getBytes("UnicodeBigUnmarked"),数据便一切正常了 于是分析了一下 String temp = "a";         try {             byte[] unicodes = temp.getBytes("Unicode");             System.out.println("unicodes=" + unicodes.length);            for (int i = 0; i < unicodes.length; i++) {                System.out.println(unicodes[i]);            }             unicodes = temp.getBytes("UnicodeLittleUnmarked");            System.out.println("unicodes=" + unicodes.length);            for (int i = 0; i < unicodes.length; i++) {                System.out.println(unicodes[i]);            }                       unicodes = temp.getBytes("UnicodeBigUnmarked");            System.out.println("unicodes=" + unicodes.length);            for (int i = 0; i < unicodes.length; i++) {                System.out.println(unicodes[i]);            }         } catch (UnsupportedEncodingException e) {                       e.printStackTrace();        } 输出结果: unicodes=4-1-2970unicodes=2970unicodes=2097 为什么会有这种结果呢?蓝色的返回了四个字节,-1,-2,是字节顺的一种表示,这是由sun的类库实现, 指示如果没有指定字节就使用默认的UnicodeLittle 但为了标识这种字节顺,就使用了-1,-2在前面表示。 UnicodeLittleUnmarked的结果,其返回字节只是两个字节,这与Unicode的编码相符合,注意到97,0与使用Unicode时后两个字节顺序一样。 UnicodeBigUnmarked的结果,字节顺与Little相反,也没有-1,-2. 由以上应该知道,temp.getBytes("Unicode");应该小心使用,应该注意它返回的-1,-2,这两个字节,因为在一些网络程序中,特别是当对方是由java以外的语言编写,有可能不会使用这种方式来标识字节顺,因此要了解对方的细节,这样才能保证数据的准确传递。

2011-11-16 0comments 96hotness 0likes mikebai Read all
dev

Android 如何设置 Notification 中PendingIntent 的 Intent

已经凌晨了,外面下着该死的雨,把我阻挡在教学楼却不能回寝室(其实主要是我没有可以换的衣服和裤子了,如果冲回去的话...后果可想而知 :)),并且还有那该死的Notification 中 PendingIntent 中的 Intent 却老是配置不好,不过令人欣慰和激动的是我还是搞定了,嘿嘿。废话少说,言归正传。   今天在写完 “ Android Notification 的使用 ” 的时候,发现有几个问题,特别是设置Notification的Intent使之能够像 QQ 或其他程序一样能够正确回调到之前已经放置在后台的Task中的对应Activity,而不是创建它的一个新实例。当然重点便是如何设置该 Activity 的 launchMode 与 Intent 的 Flags 了,说到这里,我不得不说一下今晚的调试经历,当然这里所说的所有的Notification都设置了FLAG_ONGOING_EVENT。   按照 “ (转载)Android下Affinities和Task ”一文所说的,我们不难得出这样的结论:   1、设置当用户触发Notification时所发出的Intent,如果设置 FLAG_ACTIVITY_CLEAR_TOP 与 FLAG_ACTIVITY_NEW_TASK ,而launchMode保持不变(即默认为:standard),则当用户用手点击Notification时,此时匹配到后台的Task,并把在堆栈中对应要启动的Activity之前的所有Activity全部清除掉,并且由于 standard 默认对于新的Intent总是创建新的Activity对象。因此存在于该Task中旧的Activity也会被清除掉,然后在该Task中创建新的 Activity对象。   2、设置当用户触发Notification时所发出的Intent,如果设置 FLAG_ACTIVITY_CLEAR_TOP 与 FLAG_ACTIVITY_NEW_TASK,而launchMode设置为singleTop,则当用户用手点击Notification时,同1一样,只是存在于该Task中旧的Activity不会被清除掉,此时Intent传递给已经存在的Activity并不会创建新的Activity。   上面得出的结论,经过返回测试,1是正确的,2却存在着很莫名奇妙的问题   假设现在有个程序X,有2个Activity,分别是 A , B ,其中 A 是 设置了android.intent.action.MAIN的Activity(入口Activity),两者的launchMode都为默认的 standard,创建该Intent的代码如下:   Intent intent = new Intent(this, A.class);   intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);   很明显我们设置的是当用户点击 Notification 时,应该出现的是 A Activity,但无论如何按home键退出当前Task,并使之成为后台Task,在从程序列表启动该程序总能恢复到Task顶端的Activity 给用户,如 当前 B,按home键,在从程序列表启动 X ,这个时候出现的Activity任然是 B,但按照如下的方法操作却会使得从程序列表启动 X,出现的是新创建的A Activity,其中经过Log打印得知下面的所有Activity都在同一个Task中   1、打开程序出现A,从A startActivity 到B,按Home键,点Notification出现A,再从A startActivity 到 B,按Home键,从程序列表打开程序 出现新创建的实例A   2、打开程序出现A,从A startActivity 到B,点Notification出现A,再从A startActivity 到B,按Home键,从程序列表打开程序也出现了新创建的实例A   这里所说的“新创建的实例A”都是创建在同一Task中的新的A Activity实例,也就是说按照以上两种方法,再按返回键,出现的则是 B,再按返回键出现的则是 A。这里我实在想不出为什么会在同一Task中创建一个新的Activity,就算从程序列表打开程序的Intent使用了 FLAG_ACTIVITY_NEW_TASK标记,我也不知道为什么,如果有朋友知道,一定要告诉我。   到这里,我开始发现 从程序列表启动 的优越性,因为不管是在什么时候按Home,再次从程序列表启动时,总能返回到Task的栈顶Activity。起初我想过一个办法,便是重载 Activity写一个类实现当onResume的时候更新Notification,然后我的所有Activity类都直接从该类继承,使得当按 Home 之后总能让Notification记住Task的栈顶Activity,就像QQ一样,但这种方法当然有点牵强,于是我开始看SDK 中 有关Home的Simple,终于发现了如果使用如下的Intent,便不会调用对应的Activity,而是调用Task中的栈顶Activity   Intent intent = new Intent(Intent.ACTION_MAIN);   intent.addCategory(Intent.CATEGORY_LAUNCHER);   intent.setClass(this, Main.class);   intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);   除了 setClass 可以换成使用 setClassName 绑定,FLAG_ACTIVITY_RESET_TASK_IF_NEEDED可以不设,其他的选项都缺一不可。设置ACTION_MAIN与 CATEGORY_LAUNCHER是把该Intent发给了系统对应创建程序的模块,然后系统该模块根据设定的包与类信息还有flags进行处理。当然所有的Intent工作原理都是这样,只是对 ACTION_MAIN - CATEGORY_LAUNCHAR 的处理较为特殊,使得总是显示Task栈顶的Activity而不是setClass设定的Activity类。

2011-11-10 0comments 102hotness 0likes mikebai Read all
dev

Activity的启动模式(android:launchMode)

在android里,有4种activity的启动模式,分别为: “standard” (默认) “singleTop” “singleTask” “singleInstance” 它们主要有如下不同: 1. 如何决定所属task “standard”和”singleTop”的activity的目标task,和收到的Intent的发送者在同一个task内,除非intent包括参数FLAG_ACTIVITY_NEW_TASK。 如果提供了FLAG_ACTIVITY_NEW_TASK参数,会启动到别的task里。 “singleTask”和”singleInstance”总是把activity作为一个task的根元素,他们不会被启动到一个其他task里。 此话描述不正确, 感谢 liuluxu1989 提出。 这篇博文写的比较简单, 也没有任何图示, 不便大家理解, 建立大家直接看Dev guide.  或者下面这篇博文: http://marshal.easymorse.com/archives/2950 2. 是否允许多个实例 “standard”和”singleTop”可以被实例化多次,并且存在于不同的task中,且一个task可以包括一个activity的多个实例; “singleTask”和”singleInstance”则限制只生成一个实例,并且是task的根元素。 singleTop要求如果创建intent的时候栈顶已经有要创建 的Activity的实例,则将intent发送给该实例,而不发送给新的实例。 3. 是否允许其它activity存在于本task内 “singleInstance”独占一个task,其它activity不能存在那个task里;如果它启动了一个新的activity,不管新的activity的launch mode 如何,新的activity都将会到别的task里运行(如同加了FLAG_ACTIVITY_NEW_TASK参数)。 而另外三种模式,则可以和其它activity共存。 4. 是否每次都生成新实例 “standard”对于没一个启动Intent都会生成一个activity的新实例; “singleTop”的activity如果在task的栈顶的话,则不生成新的该activity的实例,直接使用栈顶的实例,否则,生成该activity的实例。 比如现在task栈元素为A-B-C-D(D在栈顶),这时候给D发一个启动intent,如果D是 “standard”的,则生成D的一个新实例,栈变为A-B-C-D-D。 如果D是singleTop的话,则不会生产D的新实例,栈状态仍为A-B-C-D 如果这时候给B发Intent的话,不管B的launchmode是”standard” 还是 “singleTop” ,都会生成B的新实例,栈状态变为A-B-C-D-B。 “singleInstance”是其所在栈的唯一activity,它会每次都被重用。 “singleTask”如果在栈顶,则接受intent,否则,该intent会被丢弃,但是该task仍会回到前台。 当已经存在的activity实例处理新的intent时候,会调用onNewIntent()方法 如果收到intent生成一个activity实例,那么用户可以通过back键回到上一个状态;如果是已经存在的一个activity来处理这个intent的话,用户不能通过按back键返回到这之前的状态。  

2011-11-10 0comments 124hotness 0likes mikebai Read all
1…3334353637…62

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