当前位置:  编程技术>移动开发
本页文章导读:
    ▪Activity起步模式        Activity启动模式 在android里,有4种activity的启动模式,分别为: “standard” (默认) “singleTop” “singleTask” “singleInstance”   它们主要有如下不同:   1. 如何决定所属task “standard”和”singleT.........
    ▪ ListView 中的TextView兑现跑马灯效果        ListView 中的TextView实现跑马灯效果 转载:http://blog.csdn.net/sky181772733/article/details/7003125#   案例:怎么样在一个ListView中含有TextView的item中实现字母滚动呢。这个在一些特定的场合经常用得到。.........
    ▪ 界别activity四中启动模式详解       区分activity四中启动模式详解 区分Activity的四种加载模式 在多Activity开发中,有可能是自己应用之间的Activity跳转,或者夹带其他应用的可复用Activity。可能会希望跳转到原来某个Activity实例,.........

[1]Activity起步模式
    来源: 互联网  发布时间: 2014-02-18
Activity启动模式

在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键返回到这之前的状态。

 

 

 

该文来自网络,源地址已经忘了, 原作者可以与我联系,以注明版权!

 

总结:

standard 每次都会新建,每个Task都可以有,且每个Task都可以有多个实例(每个Task都可以有,且可以有多个)
singleTop 当前实例如果在栈顶,就不新建实例,调用其OnNewIntent。 如不在栈顶,则新建实例 (每个Task都可以有,且可以有多个,在栈顶时可复用)
singleTask 新建一个Task,如果已经有其他的Task并且包含该实例,那就直接调用那个Task的实例。(只有一个Task中会有)
singleInstance 新建一个Task,且在该Task中只有它的唯一一个实例。 (只有一个Task会有,且该Task中只有它)


FLAG_ACTIVITY_NEW_TASK 类似singleTask
FLAG_ACTIVITY_SINGLE_TOP 类似singleTop
FLAG_ACTIVITY_CLEAR_TOP 无对应

 

配两个图,我觉得很清晰:

(1)standard

 

(2)singleTask

可以将TaskA TaskB理解为两个应用,比如TaskA是你当前的应用,TaskB是默认浏览器。

当到了TaskB中后,按返回键,需要先在TaskB中返回到root,然后才能返回到TaskA。

 

 

总结成以下几句

 

[plain] view plaincopyprint?
  • standard 每次都会新建,每个Task都可以有,且每个Task都可以有多个实例(每个Task都可以有,且可以有多个)
  • singleTop 当前实例如果在栈顶,就不新建实例,调用其OnNewIntent。 如不在栈顶,则新建实例 (每个Task都可以有,且可以有多个,在栈顶时可复用)
  • singleTask 新建一个Task,如果已经有其他的Task并且包含该实例,那就直接调用那个Task的实例。(只有一个Task中会有)
  • singleInstance 新建一个Task,且在该Task中只有它的唯一一个实例。 (只有一个Task会有,且该Task中只有它)

  •     
    [2] ListView 中的TextView兑现跑马灯效果
        来源: 互联网  发布时间: 2014-02-18
    ListView 中的TextView实现跑马灯效果

    转载:http://blog.csdn.net/sky181772733/article/details/7003125#

     

    案例:怎么样在一个ListView中含有TextView的item中实现字母滚动呢。这个在一些特定的场合经常用得到。如下图,当焦点位于某个item的时候其内容就自动滚动显示

    要实现这样的效果,废话不多说直接上代码:

    adapter对应的layout

    对应的listView的layout

    切记千万不要在TextView中加上android:focusable="true"

    view plain
  • <LinearLayout android:orientation="vertical"  
  •     android:layout_width="fill_parent" android:layout_height="wrap_content"  
  •     xmlns:android="http://schemas.android.com/apk/res/android">  
  •     <RelativeLayout android:gravity="center_vertical"  
  •         android:orientation="horizontal" android:layout_width="fill_parent"  
  •         android:layout_height="32.0dip">  
  •         <TextView android:textSize="16dip" android:gravity="center"  
  •             android:id="@+id/list_live_content_time" android:layout_width="56dip"  
  •             android:layout_height="fill_parent" />  
  •         <TextView android:textSize="16dip" android:ellipsize="marquee"  
  •             android:id="@+id/list_live_content_programm" android:layout_width="260dip"  
  •             android:layout_height="fill_parent" android:singleLine="true"  
  •             android:layout_toRightOf="@id/list_live_content_time" />  
  •     </RelativeLayout>  
  • </LinearLayout>  

  •  

    man.xml

    如下红色字体 一定要加上 android:focusable="true"

    view plain
  • <!--如下红色字体 一定要加上 android:focusable="true" -->  
  •   
  •  <?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">  
  •     <TextView android:layout_width="fill_parent"  
  •         android:layout_height="wrap_content" android:text="@string/hello" />  
  •     <ListView android:id="@+id/list" android:layout_height="wrap_content"  
  •         android:layout_width="fill_parent"   android:focusable="true"  
  •         android:background="@android:color/transparent"></ListView>  
  • </LinearLayout>  


  • 主类代码:ListViewItemActivity。java

    view plain
  • package com.jzh.testitem;  
  •   
  • import java.util.ArrayList;  
  • import java.util.List;  
  •   
  • import android.app.Activity;  
  • import android.os.Bundle;  
  • import android.view.View;  
  • import android.widget.AdapterView;  
  • import android.widget.AdapterView.OnItemClickListener;  
  • import android.widget.ListView;  
  •   
  • public class ListViewItemActivity extends Activity {  
  •     /** Called when the activity is first created. */  
  •     private ListItemAdapter adapter;  
  •     private List<Channel> list;  
  •     private ListView channelList;  
  •   
  •     @Override  
  •     public void onCreate(Bundle savedInstanceState) {  
  •         super.onCreate(savedInstanceState);  
  •         setContentView(R.layout.main);  
  •         channelList = (ListView) findViewById(R.id.list);  
  •         list = new ArrayList<Channel>();  
  •         list.add(new Channel(  
  •                 "9:12",  
  •                 "那些流逝的时光我想和电影里一样对你说--我爱你,我爱你,我爱你..光影世界的我爱你。一次一次,我不厌其烦地切回那个镜头,找到你最深情的一刻,复制这句不能再普通不能再庸俗的话语。而你,屡屡感动我在冰冷的屏幕前。"));  
  •         list.add(new Channel("10:35", "A不喜欢吃鸡蛋,每次发了鸡蛋都给B吃。"));  
  •         list.add(new Channel("12:55",  
  •                 "A不喜欢吃鸡蛋,每次发了鸡蛋都给B吃。刚开始B很感谢,久而久之便习惯了。习惯了,便理所当然了"));  
  •         list.add(new Channel(  
  •                 "14:30",  
  •                 "于是,直到有一天,A将鸡蛋给了C,B就不爽了。她忘记了这个鸡蛋本来就是A的,A想给谁都可以。为此,她们大吵一架,从此绝交。其实,不是别人不好了,而是我们的要求变多了。习惯了得到,便忘记了感恩。"));  
  •         adapter = new ListItemAdapter(this.getApplicationContext(), list);  
  •         channelList.setAdapter(adapter);  
  •         channelList.setOnItemClickListener(new OnItemClickListener() {  
  •   
  •             @Override  
  •             public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,  
  •                     long arg3) {  
  •                 adapter.setIndex(arg2);  
  •                 adapter.notifyDataSetChanged();  
  •   
  •             }  
  •         });  
  •     }  
  • }   

  • adapter类代码: ListItemAdapter.java

    注意下面加注释的两行代码一定要设置你的textView的setSelected(true);

    view plain
  • package com.jzh.testitem;  
  •   
  • import java.util.List;  
  •   
  • import android.content.Context;  
  • import android.graphics.Color;  
  • import android.view.LayoutInflater;  
  • import android.view.View;  
  • import android.view.ViewGroup;  
  • import android.widget.BaseAdapter;  
  • import android.widget.TextView;  
  •   
  • public class ListItemAdapter extends BaseAdapter {  
  •     private LayoutInflater inflater;  
  •     private List<Channel> items;  
  •     private int index = 0;  
  •   
  •     public ListItemAdapter(Context context, List<Channel> items) {  
  •         super();  
  •         this.inflater = LayoutInflater.from(context);  
  •         this.items = items;  
  •     }  
  •   
  •     public void setIndex(int selected) {  
  •         index = selected;  
  •     }  
  •   
  •     @Override  
  •     public int getCount() {  
  •         // TODO Auto-generated method stub  
  •         return items.size();  
  •     }  
  •   
  •     @Override  
  •     public Object getItem(int position) {  
  •         // TODO Auto-generated method stub  
  •         return items.get(position);  
  •     }  
  •   
  •     @Override  
  •     public long getItemId(int position) {  
  •         // TODO Auto-generated method stub  
  •         return position;  
  •     }  
  •   
  •     @Override  
  •     public View getView(int position, View convertView, ViewGroup parent) {  
  •         ViewHolder holder;  
  •         if (convertView == null) {  
  •             convertView = inflater.inflate(R.layout.live_content_adapter, null);  
  •             holder = new ViewHolder();  
  •             holder.time_tv = (TextView) convertView  
  •                     .findViewById(R.id.list_live_content_time);  
  •             holder.content_tv = (TextView) convertView  
  •                     .findViewById(R.id.list_live_content_programm);  
  •         } else {  
  •             holder = (ViewHolder) convertView.getTag();  
  •         }  
  •         if (index == position) {  
  •           
  •             convertView.setBackgroundColor(Color.GREEN);  
  •                              //此处就是设置textview为选中状态,方可以实现效果         
  •              convertView.findViewById(R.id.list_live_content_programm)  
  •              .setSelected(true);  
  •   
  •         } else {  
  •             convertView.setBackgroundColor(Color.BLUE);  
  •             //没选中的就不用设置了                             
  •                         convertView.findViewById(R.id.list_live_content_programm)  
  •              .setSelected(false);  
  •         }  
  •         convertView.setTag(holder);  
  •         holder.time_tv.setText(items.get(position).getLiveTime());  
  •         holder.content_tv.setText(items.get(position).getLiveContent());  
  •         return convertView;  
  •     }  
  •   
  •     private class ViewHolder {  
  •         private TextView time_tv;  
  •         private TextView content_tv;  
  •     }  
  • }  


  • 实体类代码Channel.java

    view plain
  • package com.jzh.testitem;  
  •   
  • public class Channel {  
  •     private String liveTime;  
  •     private String liveContent;  
  •   
  •     public Channel(String liveTime, String liveContent) {  
  •         super();  
  •         this.liveTime = liveTime;  
  •         this.liveContent = liveContent;  
  •     }  
  •   
  •     public String getLiveTime() {  
  •         return liveTime;  
  •     }  
  •   
  •     public String getLiveContent() {  
  •         return liveContent;  
  •     }  
  •   
  • }  


  • 这篇文章是我转载的  这个人的 http://blog.csdn.net/jzh2012/article/details/6885204  大家可以看看,其实我最后找到了比较简单的相对来说你可以在 item的里面设置TextView的属性,至少我先在认为的几个不可或去的  

    [java] view plaincopyprint?
  • <TextView android:id="@+id/app_loc"   
  •             android:layout_width="120dip"  
  •             android:layout_height="wrap_content"   
  •             android:textColor="#000000"   
  •             android:textSize="12dp"  
  •             android:layout_marginLeft="10dip"  
  •             android:focusableInTouchMode="true"  
  •             android:ellipsize="marquee"    
  •             android:scrollHorizontally="true"   
  •             android:marqueeRepeatLimit="marquee_forever"></TextView>  

  • 可以参考我的一下....然后 如果想不获取焦点就让TextView 的跑马灯效果 直接在自定义adapter中setView方法找到 该TextView 并设置 成convertView.findViewById(R.id.app_loc)  
            .setSelected(true); 

        
    [3] 界别activity四中启动模式详解
        来源: 互联网  发布时间: 2014-02-18
    区分activity四中启动模式详解
    区分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将发送给新的实例。

    现在点Android设备的回退键,可以看到是按照刚才创建Activity实例的倒序依次出现,类似退栈的操作,而刚才操作跳转按钮的过程是压栈的操作。如下图:

     

    singleTop

    singleTop和standard模式,都会将intent发送新的实例(后两种模式不发送到新的实例,如果已经有了的话)。不过,singleTop要求如果创建intent的时候栈顶已经有要创建的Activity的实例,则将intent发送给该实例,而不发送给新的实例。

    还是用刚才的示例,只需将launchMode改为singleTop,就能看到区别。

    运行的时候会发现,按多少遍按钮,都是相同的ActiA实例,因为该实例在栈顶,因此不会创建新的实例。如果回退,将退出应用。

    singleTop模式,可用来解决栈顶多个重复相同的Activity的问题。

    如果是A Activity跳转到B Activity,再跳转到A Activity,行为就和standard一样了,会在B Activity跳转到A Activity的时候创建A Activity的新实例,因为当时的栈顶不是A Activity实例。

    ActA类稍作改动:

    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 actB");
    button.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
    Intent intent = new Intent();
    intent.setClass(ActA.this, ActB.class);
    startActivity(intent);
    }
    });
    LinearLayout layout = new LinearLayout(this);
    layout.setOrientation(LinearLayout.VERTICAL);
    layout.addView(textView);
    layout.addView(button);
    this.setContentView(layout);
    }
    }

     

    ActB类:

    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;

    public class ActB extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    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(ActB.this, ActA.class);
    startActivity(intent);
    }
    });
    LinearLayout layout=new LinearLayout(this);
    layout.addView(button);
    this.setContentView(layout);
    }
    }

     

    ActB类使用默认(standard)加载,ActA使用singleTop加载。结果类似下图:

    如果把ActA的加载模式改为standard,情况一样。

    singleTask

    singleTask模式和后面的singleInstance模式都是只创建一个实例的。

    当intent到来,需要创建singleTask模式Activity的时候,系统会检查栈里面是否已经有该Activity的实例。如果有直接将intent发送给它。

    把上面singleTop的实例中的ActA的launchMode改为singleTask,ActB的改为standard。那么会发现在ActA界面中按一次按钮:

    然后在ActB1界面中按按钮,因为ActA是singleTask,会使用原来的ActA1实例。这时候栈内的情况:

     

    如果多次按按钮跳转,会发现始终只有ActA1这一个ActA类的实例。

     

    singleInstance

    解释singleInstance模式比较麻烦。

    首先要说一下Task(任务)的概念。

    如果是Swing或者Windows程序,可能有多个窗口可以切换,但是你无法在自己程序中复用人家的窗口。注意是直接复用人家的二进制代码,不是你拿到人家api后的源代码级调用。

    Android可以做到,让别人的程序直接复用你的Activity(类似桌面程序的窗口)。

    Android为提供这种机制,就引入了Task的概念。Task可以认为是一个栈,可放入多个Activity。比如启动一个应用,那么Android就创建了一个Task,然后启动这个应用的入口Activity,就是intent-filter中配置为main和launch的那个(见一个APK文件部署产生多个应用安装的效果)。这个Activity是根(Root)Activity,可能会在它的界面调用其他Activity,这些Activity如果按照上面那三个模式,也会在这个栈(Task)中,只是实例化的策略不同而已。

    验证的办法是调用和打印Activity的taskId:

    TextView textView2 = new TextView(this);
    textView2.setText("task id: "+this.getTaskId());

    会发现,无论切换Activity,taskId是相同的。

    当然也可以在这个单一的Task栈中,放入别人的Activity,比如google地图,这样用户看过地图按回退键的时候,会退栈回到调用地图的Activity。对用户来说,并不觉得在操作多个应用。这就是Task的作用。

    但是,有这样的需求,多个Task共享一个Activity(singleTask是在一个task中共享一个Activity)。

    现成的例子是google地图。比如我有一个应用是导游方面的,其中调用的google地图Activity。那么现在我比如按home键,然后到应用列表中打开google地图,你会发现显示的就是刚才的地图,实际上是同一个Activity。

    如果使用上面三种模式,是无法实现这个需求的。google地图应用中有多个上下文Activity,比如路线查询等的,导游应用也有一些上下文Activity。在各自应用中回退要回退到各自的上下文Activity中。

    singleInstance模式解决了这个问题(绕了这么半天才说到正题)。让这个模式下的Activity单独在一个task栈中。这个栈只有一个Activity。导游应用和google地图应用发送的intent都由这个Activity接收和展示。

    这里又有两个问题:

    • 如果是这种情况,多个task栈也可以看作一个应用。比如导游应用启动地图Activity,实际上是在导游应用task栈之上singleInstance模式创建的(如果还没有的话,如果有就是直接显示它)一个新栈,当这个栈里面的唯一Activity,地图Activity回退的时候,只是把这个栈移开了,这样就看到导游应用刚才的Activity了;
    • 多个应用(Task)共享一个Activity要求这些应用都没有退出,比如刚才强调要用home键从导游应用切换到地图应用。因为,如果退出导游应用,而这时也地图应用并未运行的话,那个单独的地图Activity(task)也会退出了。

    如果还是拿刚才的ActA和ActB的示例,可以把ActB的模式改为singleInstance,ActA为standard,如果按一次按钮切换到ActB,看到现象用示意图类似这样:

    如果是第一次按钮切换到ActB,在ActB在按按钮切换到ActA,然后再回退,示意图是:

    另外,可以看到两个Activity的taskId是不同的。


        
    最新技术文章:
    ▪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