mikebai.com

  • Home
  • dev
  • DotNET
  • M365
  • 搞笑
  • 杂七杂八
  • FocusDict
個人BLOG
it developer
dev

区分Activity的四种加载模式

在多Activity开发中,有可能是自己应用之间的Activity跳转,或者夹带其他应用的可复用Activity。可能会希望跳转到原来某个Activity实例,而不是产生大量重复的Activity。 这需要为Activity配置特定的加载模式,而不是使用默认的加载模式。 加载模式分类及在哪里配置 Activity有四种加载模式: standard singleTop singleTask singleInstance 设置的位置在AndroidManifest.xml文件中activity元素的android:launchMode属性: <activity android:name="ActB" android:launchMode="singleTask"></activity> 也可以在Eclipse ADT中图形界面中编辑: 区分Activity的加载模式,通过示例一目了然。这里编写了一个Activity A(ActA)和Activity B(ActB)循环跳转的例子。对加载模式修改和代码做稍微改动,就可以说明四种模式的区别。 standard 首先说standard模式,也就是默认模式,不需要配置launchMode。先只写一个名为ActA的Activity: package com.easymorse.activities; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.LinearLayout; import android.widget.TextView; public class ActA extends Activity {     /** Called when the activity is first created. */     @Override     public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         TextView textView = new TextView(this);         textView.setText(this + "");         Button button = new Button(this);         button.setText("go actA");         button.setOnClickListener(new OnClickListener() {             @Override             public void onClick(View v) {                 Intent intent = new Intent();                 intent.setClass(ActA.this, ActA.class);                 startActivity(intent);             }         });         LinearLayout layout = new LinearLayout(this);         layout.setOrientation(LinearLayout.VERTICAL);         layout.addView(textView);         layout.addView(button);         this.setContentView(layout);     } } 例子中都没有用layout,免得看着罗嗦。可见是ActA –> ActA的例子。在界面中打印出对象的toString值可以根据hash code识别是否创建新ActA实例。 第一个界面: 点击按钮后: 可以多点几次。发现每次都创建了该Activity的新实例。standard的加载模式就是这样的,intent将发送给新的实例。

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

java 嵌套类的实例化问题

No enclosing instance of type Foo is accessible. Must qualify the allocation with an enclosing instance of type Foo (e.g. x.new A() where x is an instance of Foo). You can get the error No enclosing instance of type Foo is accessible. Must qualify the allocation with an enclosing instance of type Foo (e.g. x.new A() where x is an instance of Foo). if you try to instantiate an inner class without an instance of the outer class. @@@ check! WRONG class Foo { private class Bar { // stuff } } class Baz { Foo.Bar aBar = new Foo.Bar(); // wrong! } WRONG class Foo { private class Bar { // stuff } } class Baz { Foo.Bar aBar = (new Foo).new Bar(); }

2011-11-08 0comments 111hotness 0likes mikebai Read all
dev

Android程序的真正入口Application

接触android已经有一段时间了,一直以为android程序的入口是配置文件中指定的Activity,最近看一个开源项目,发现里面实现了android 的Application类,才知道,android程序的真正入口是Application类的onCreate方法。只不过大多数开发者无需重写该类,它的继承关系如下图:java.lang.Object   ↳ android.content.Context     ↳ android.content.ContextWrapper       ↳ android.app.Applicationandroid.app.Application类包含了4个公开的方法   void  onConfigurationChanged(Configuration newConfig)   void  onCreate()  //这里才是真正的入口点。   void  onLowMemory()   void  onTerminate()下面是测试代码:使用application需要两个步骤:1.复写Application类,2.在配置文件中配置示例代码如下:MyApp类:package app.app;import android.app.Application;import android.content.res.Configuration;public class MyApp extends Application {@Overridepublic void onConfigurationChanged(Configuration newConfig) {  super.onConfigurationChanged(newConfig);}@Overridepublic void onCreate() {  super.onCreate();  System.out.println("MyApp is called");}@Overridepublic void onLowMemory() {  super.onLowMemory();}@Overridepublic void onTerminate() {  super.onTerminate();}}配置文件:<application android:icon="@drawable/icon" android:label="@string/app_name" android:name="app.app.MyApp" >  ......</application>Activity类:public void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.main);  System.out.println("MainActivity is called");    }结果:MyApp is called       MainActivity is called      注释1:在Android中,Application只是一个松散的表征概念,没有多少实质上的表征[和J2me的Midlet有明显区别]。Application类,代表应用程序上下文状态,是一个极度弱化的概念。 Application只是一个空间范畴的概念,Application就是Activity,Service之类的组件上下文描述。 Application并不是Android的核心概念,而Activity才是Android的核心概念注释2:MyApplication类的作用是为了放一些全局的和一些上下文都要用到变量和方法。

2011-11-06 0comments 126hotness 0likes mikebai Read all
dev

android Notification 的使用

    最近一直在研究 android ,并一边研究一边做应用。其中遇到了把程序通知常驻在 Notification 栏,并且不能被 clear 掉(就像android QQ一样)的问题。经过研究实现了其功能,现把 Notification 的使用总结如下: Notification 的使用需要导入 3 个类1 import android.app.PendingIntent;2 import android.app.NotificationManager;3 import android.app.Notification; 代码示例及说明01 NotificationManager nm = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);              02 Notification n = new Notification(R.drawable.chat, "Hello,there!", System.currentTimeMillis());            03 n.flags = Notification.FLAG_AUTO_CANCEL;               04 Intent i = new Intent(arg0.getContext(), NotificationShow.class);05 i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);          06 //PendingIntent07 PendingIntent contentIntent = PendingIntent.getActivity(08         arg0.getContext(),09         R.string.app_name,10         i,11         PendingIntent.FLAG_UPDATE_CURRENT);12                  13 n.setLatestEventInfo(14         arg0.getContext(),15         "Hello,there!",16         "Hello,there,I'm john.",17         contentIntent);18 nm.notify(R.string.app_name, n); 下面依次对每一段代码进行分析:1 NotificationManager nm = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE); 创建 NotificationManager,其中创建的 nm 对象负责“发出”与“取消”  Notification。1 Notification n = new Notification(R.drawable.chat, "Hello,there!", System.currentTimeMillis());            2 n.flags = Notification.FLAG_ONGOING_EVENT; 创建 Notification ,参数依次为:icon的资源id,在状态栏上展示的滚动信息,时间。其中创建的 n 对象用来描述出现在系统通知栏的信息,之后我们将会看到会在 n 对象上设置点击此条通知发出的Intent。1 n.flags = Notification.FLAG_AUTO_CANCEL; 设置 n.flags 为 Notification.FLAG_AUTO_CANCEL ,该标志表示当用户点击 Clear 之后,能够清除该通知。1 Intent i = new Intent(arg0.getContext(), NotificationShow.class);2 i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK); 创建一个Intent,该Intent使得当用户点击该通知后发出这个Intent 请注意,如果要以该Intent启动一个Activity,一定要设置 Intent.FLAG_ACTIVITY_NEW_TASK 标记。 Intent.FLAG_ACTIVITY_CLEAR_TOP :如果在当前Task中,有要启动的Activity,那么把该Acitivity之前的所有Activity都关掉,并把此Activity置前以避免创建Activity的实例 Intent.FLAG_ACTIVITY_NEW_TASK :系统会检查当前所有已创建的Task中是否有该要启动的Activity的Task,若有,则在该Task上创建Activity,若没有则新建具有该Activity属性的Task,并在该新建的Task上创建Activity。更多请参见 “ (转载)Android下Affinities和Task ”1 //PendingIntent2 PendingIntent contentIntent = PendingIntent.getActivity(3         arg0.getContext(),4         R.string.app_name,5         i,6         PendingIntent.FLAG_UPDATE_CURRENT); PendingIntent 为Intent的包装,这里是启动Intent的描述,PendingIntent.getActivity 返回的PendingIntent表示,此PendingIntent实例中的Intent是用于启动 Activity 的Intent。PendingIntent.getActivity的参数依次为:Context,发送者的请求码(可以填0),用于系统发送的Intent,标志位。 其中 PendingIntent.FLAG_UPDATE_CURRENT  表示如果该描述的PendingIntent已存在,则改变已存在的PendingIntent的Extra数据为新的PendingIntent的Extra数据。 这里再简要说一下 Intent 与 PendingIntent 的区别: Intent :意图,即告诉系统我要干什么,然后系统根据这个Inten

2011-11-06 0comments 111hotness 0likes mikebai Read all
dev

Android多线程的简要分析

在J2ME中,多线程的处理是很简单的,似乎并不用考虑很多问题,顶多是同步方面很让人头疼,而在Android中,一切似乎不那么明了了,很重要的一点是在其他线程中是不能直接访问主UI线程成员的。比如说从网上获取一个网页,在一个TextView中将其源代码显示出来,这种涉及到网络操作的程序一般都是需要开一个线程完成网络访问,但是在获得页面源码后,是不能直接在网络操作线程中调用TextView.setText()的,在C#中也是这样,可能是为了主线程的安全吧。对于此类情况,Android提供了一些间接访问的方法。 1.runOnUiThread函数这个函数是Activity的成员函数,格式是public final void runOnUiThread (Runnable action)在自定义线程中执行对应Activity的runOnUiThread函数就好了,但是很明显,参数还是个线程,这个 函数基本上没什么意义。 2.Handler这应该是Android多线程中用的最多的工具了,这里Android借鉴了Windows的消息机制,不同线程之间可以用消息进行交流。除了主线程(UI线程)外,通过继承Thread或Runnable生成的线程是不包含消息循环(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是用来接受并处理消息的,如果像上面写的那样调用无参数构造函数生成handler,这个Handler对应的就是所在线程,也可以用Looper做参数,这样生成的Handler对应的是Looper所在的线程。可以通过Looper.myLooper()获取当前线程的Looper。调用Handler对象的sendMessage(Message)函数可以向对应线程发送消息。例:public class ThreadMain extends Activity {    /** Called when the activity is first created. */private final static int MSG_BEGIN=1;private final static int MSG_END=2;    private ProgressDialog dialog=null;    private Button bt=null;    private Handler handle=new Handler(){    public void handleMessage(Message msg){       switch(msg.what){       case MSG_BEGIN:        showProgress();        break;              case MSG_END:        dismissProgress();        alertDialog();        break;       }       super.handleMessage(msg);    }    };       @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        bt=(Button)findViewById(R.id.bt);        bt.setOnClickListener(new OnClickListener(){    @Override    public void onClick(View v) {     // TODO Auto-generated method stub     doThread();    }});    }       private void doThread(){    new Thread(){       public void run(){        try{         sendMsg(MSG_BEGIN);         Thread.sleep(4000);         sendMsg(MSG_END);        }catch(Exception e){         e

2011-11-05 0comments 111hotness 0likes mikebai Read all
dev

ViewFlipper的使用

屏幕切换指的是在同一个Activity内屏幕见的切换,最长见的情况就是在一个FrameLayout内有多个页面,比如一个系统设置页面;一个个性化设置页面。 通过查看OPhone API文档可以发现,有个android.widget.ViewAnimator类继承至FrameLayout,ViewAnimator类的作用是为FrameLayout里面的View切换提供动画效果。该类有如下几个和动画相关的函数: l setInAnimation:设置View进入屏幕时候使用的动画,该函数有两个版本,一个接受单个参数,类型为android.view.animation.Animation;一个接受两个参数,类型为Context和int,分别为Context对象和定义Animation的resourceID。   setOutAnimation: 设置View退出屏幕时候使用的动画,参数setInAnimation函数一样。 showNext: 调用该函数来显示FrameLayout里面的下一个View。 showPrevious: 调用该函数来显示FrameLayout里面的上一个View。   一般不直接使用ViewAnimator而是使用它的两个子类ViewFlipper和ViewSwitcher。ViewFlipper可以用来指定FrameLayout内多个View之间的切换效果,可以一次指定也可以每次切换的时候都指定单独的效果。该类额外提供了如下几个函数:   isFlipping: 用来判断View切换是否正在进行 setFilpInterval:设置View之间切换的时间间隔 startFlipping:使用上面设置的时间间隔来开始切换所有的View,切换会循环进行 stopFlipping: 停止View切换 ViewSwitcher 顾名思义Switcher特指在两个View之间切换。可以通过该类指定一个ViewSwitcher.ViewFactory 工程类来创建这两个View。该类也具有两个子类ImageSwitcher、TextSwitcher分别用于图片和文本切换。 在教程中通过示例介绍ViewFlipper 的使用,其他的使用方式是类似的。详细信息可以参考文档: http://androidappdocs-staging.appspot.com/reference/android/widget/ViewAnimator.html   ViewFlipper示例 记住,ViewFlipper是继承至FrameLayout的,所以它是一个Layout里面可以放置多个View。在示例中定义一个ViewFlipper,里面包含三个ViewGroup作为示例的三个屏幕,每个ViewGroup中包含一个按钮和一张图片,点击按钮则显示下一个屏幕。代码如下(res\layout\main.xml): view plaincopy to clipboardprint? <?xml version="1.0" encoding="utf-8"?>    <LinearLayout        xmlns:android="http://schemas.android.com/apk/res/android"       android:orientation="vertical"         android:layout_width="fill_parent"       android:layout_height="fill_parent">        <ViewFlipper android:id="@+id/details"          android:layout_width="fill_parent"            android:layout_height="fill_parent"          android:persistentDrawingCache="animation"        

2011-09-26 0comments 137hotness 0likes mikebai Read all
杂七杂八

Word 2007 如何设置多级符号和编号?

  Word 2007中建立多级编号比较简单,直接在工具栏的下拉菜单就可以,但是如何定义并修改,如何建立 多级编号 与 各级标题的链接呢?       Word 03中,这个问题直接在 样式修改——编号 里,就可以设置单击或多级编号,并与各级标题进行链接,格式修改起来也方便,比如修改缩进、字号、字体等等。但是这些在07中,并非那么容易实现,具体过程如何呢? 刚研究完这个问题,与大家分享。(下面每张图都可以点开放大)   首先,点击 图1 中红圈里的按钮,新建样式;在弹出窗口的[样式类型]里选“列表”,如图2所示:   图1   图2然后点击[格式]——[编号],弹出[修改多级列表]对话框,可以分别对各级符号和编号的格式进行设置,点击左下角“更多”按钮,然后点击右侧[将级别连接到样式]下面的下拉框,可以将各个级别分别连接到文档中的不同样式,例如:将1级链接到“标题1”,将2级链接到“标题2”,将3级链接到“标题3”,如图3所示: 图3设定好之后,确定,返回创建样式对话框,将样式名称修改为“BianHao”,确定,多级符号编号设置完毕,以后撰写论文时,只需将文字设为标题1,2,3类型,就会自动按级别编号。      但是,如果以后想要修改多级符号编号或修改其链接到的样式,就会发现,建立的这个样式类型为列表、名称为“BianHao”的样式,在图1所示的“样式”列

2011-09-16 0comments 162hotness 0likes mikebai Read all
搞笑

搞笑几则0906

1/ “先生,我能帮你吗?” “开个帐户。” “你的姓名。” “马马马马马马马马马马克里·登登登登登登登登登登维奇·杰杰杰杰杰杰杰杰杰杰杰西”“先生你口吃?” “我不口吃,是我父亲口吃。给我出生登记的那人TMD是个白痴。” 【走向成熟的标志】1.早上无论多困也会马上起床上班;2.喜欢吃家常便饭多于外面的餐馆;3.喜欢隐身,网络签名长时间不改;4.喜欢看新闻多于看八卦;5.打电话给朋友的次数少了;6.可以让你开心的人或事越来越少了;7.没结果的事情渐渐就少做了;8.低落的时候宁愿选择一个人呆着。 我幼儿园看猫和老鼠,小学一年级看哆啦A梦,二年级时神龙斗士看了不下3遍,三年级足球小子改变了我们的生活,四年级迷恋柯南,五年级小樱强势来袭,六年级知道了宫崎骏剧场版!而现在的孩子呢,一年级喜羊羊,二年级喜羊羊,三年级喜羊羊,四年级喜羊羊,你五年六年级还喜羊羊,你妹的喜羊羊!! 真正的朋友就是,当你蒙蔽了所有人的眼睛,她也能看穿你真实的样子和心底的痛楚。 围脖经典语录:宁愿保持沉默让人看起来像个傻子,也不要一开口就证明自己确实如此。 【清晨起床最好别空腹吃这三种食物】1、香蕉:含有助眠的钾,还有大量的镁,空腹食用会使血液中的镁骤然升高,影响心脏功能;2、菠萝:早晨空腹吃会伤胃,饭后吃营养吸收更好;3、冷饮料:温度相差太大会强烈刺激胃肠道,导致突发性挛缩。大家要注意了哦! 围脖经典语录:宁愿为自己做过的后悔,也不愿为自己没做的遗憾。 【团队管理的致命伤】1、人为制造隔阂,不信任下属 2、政策多变,没有持续性 3、只要求下属,不要求自己 4、随性,遇到困难,解决方法简单 5、不合实际盲目做决定 6、急躁,没有定力 7、不善听取意见,自我为中心 9、个人利益为先,在乎一时得失 10、将自己压力完全释放给下属  生活有两大误区:一是生活给人看,二是看别人生活。似乎因为自己无法证明自己的幸福,所以才需要用别人的眼光来证明,其实这是一种虚荣和自卑心理在作怪。不要活得太被动,因为这样会让你很辛苦。只要自己觉得幸福就行,用不着向别人证明什么。

2011-09-06 0comments 145hotness 0likes mikebai Read all
dev

onTouchEvent 中onTouch的返回值的意义

今天想捕获Gallery的Touch事件做自己想要的处理,但你添加完setOnTouchListener监听完之后eclipse自动会生成一个 onTouch方法,就可以在这里面做你想要做的处理了,若你小心地看它会增加return false这行。我在处理完Event.ACTION_MOVE时将其改为return true。当我运行我的程序的时候发现Gallery不能左右滚动了。我就觉得很纳闷了,怎么不能滚动了呢?然后一个朋友提示我应该return false.我改完运行后,果真可以滚动了,并且我在move的时候也实现了我的处理。当时我就在想:return false和return true有何区别呢? 下面就是我在别的文章学习总结来的结论: 1,return false说明你还没消费onTouch事件,在执行完你onTouch里面的代码之后,onTouch事件并没有结束。就是会自动地执行Gallery 这个view里onTouch代码(这个为默认).所以这就是为什么没增加你的处理的时候就只自动地调用Gallery的onTouch,若你在 onTouch里面增加你的代码并且return false就会执行你的处理和默认的处理。 2,return true说明你已经消费完了onTouch事件,在执行完你的onTouch里面的代码之后,这个onTouch事件就结束了。也就是说不会再调用默认的 onTouch事件了。在onTouch里面有很多种的处理比如move,down,up....,若你在move里面return false,那么接着的fling,up等后面的事件也不会处理的。 Java代码  mGallery.setOnTouchListener(new OnTouchListener(){                  //@Override               public boolean onTouch(View v, MotionEvent event) {                   // TODO Auto-generated method stub                   System.out.println("Gallery onTouch");                   if(event.getAction()==MotionEvent.ACTION_MOVE){                       mDismiss.removeMessages(1);                       System.out.println("ACTION_MOVE ");                                          }else if(event.getAction()==MotionEvent.ACTION_UP){                       mDismiss.sendEmptyMessageDelayed(1,10000);                       System.out.println("ACTION_UP ");                   }                   return false;               }                          }); 

2011-09-02 0comments 110hotness 0likes mikebai Read all
dev

eclipse使用的几个技巧

1.快捷键设置在eclipse中无法导入既存配置,可以通过保存以下路径的文件,达到导入配置的目的 .metadata\.plugins\org.eclipse.core.runtime\.settings\org.eclipse.ui.workbench.prefs 2.ctrl+鼠标左键可以跳转到定义,但是ctrl左键我一般都是用来选择字符串进行拷贝使用,所以有冲突 可以通过更改以下配置 General → Editors → Text Editors → Hyperlinking 页面 将Default modifier key:设置从默认的CTRL更改为Alt即可.   3.android中xml格式化为每个属性占一行的格式 XML→ XML Files→ Editor页面 选中 Split multiple attributes each on a new line  

2011-08-15 0comments 110hotness 0likes mikebai Read all
1…3435363738…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