Android知识细节

1、一个activity就要有一个布局,所以新建一个Activity的时候总会新建一个相应的layout

public class MyAty extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.myaty);//将视图与Activity绑定
    }
}

  可以看到setContentView()就是讲视图与布局绑定的。除此之外,还需要将这个Activity在AndroidMainfest.xml注册。

  总结:创建一个Activity需要三个步骤:一、创建一个Activity的java类;二、创建这个Activity的布局xml,并将这两个绑定;三、在AndroidMainfest.xml中注册这个Activity。

  当然,你也可以不用这个xml格式的layout,比如: 

 private TextView tv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //这里的tv有访问res的能力,就好像具备了layout的性质。
        // 我们知道MainActivity也是继承了Context的。而有了Context就有了访问res的能力。
        tv=new TextView(MainActivity.this);
        tv.setText("HelloAndroid!");
        
        //不用layout的布局,而是自己创建了一个TextView tv
        //setContentView(R.layout.activity_main);
        setContentView(tv);
    }

  

  

 

2、Activity的生命周期

 

3、Activity的之间的参数传递,用Intent i;i

 

4、打开一个新的Activity,用startActivity()函数就好了:

        startnewbtn=(Button)findViewById(R.id.startANewActivity);

        startnewbtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //
                startActivity(new Intent(MainActivity.this,BActivity.class));
            }
        });    

  这个startnewbtn是Button的对象,他是在MainActivity中的一个组件,单击他可以到BActivity。

 

4、Bundle是指一个数据包,其中有很多的数据,就像php中的数组。传递数值:

现在第一个Activity中:

            //打开一个新的activity
            startnewbtn=(Button)findViewById(R.id.startANewActivity);

            startnewbtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //
                //startActivity(new Intent(MainActivity.this,BActivity.class));
                Intent i=new Intent(MainActivity.this,BActivity.class);
//                i.putExtra("first","来自MainActivity的第一个参数!");//这个是传递一个值
                Bundle b=new Bundle();//传递一个数据包Bundle
                b.putString("first","第一个参数!!");
                b.putInt("second",2);
                b.putChar("third",'c');
                i.putExtras(b);
//                i.putExtra("mybundle",b);//传递bundle的第二种方法

                startActivity(i);

            }
        });

  接着在第二个中接受参数:

private TextView tv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_b);

        Intent i=getIntent();
        String str=i.getStringExtra("first");

        tv= (TextView) findViewById(R.id.tv);
        tv.setText(str);
    }

  

5、Intent不但是连接两个Activity的胶水,还是传递函数的管道。

 

6、在MainActivity.xml中问什么Activity的name属性前面都要有一个点“.”,因为这个会跟前

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="info.baitian.test" >

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

  的info.baitian.test连接在一起。

 

7、Intent(显式与隐式)

显式Intent就是在创建一个Intent的时候,显式注明要启动的Activity是哪一个:

Intent i=new Intent(MainActivity.this,BActivity.class);

  第二个参数就是显式注明,我要启动的Activity就是显式注明的BActivity。

隐式Activity就是在AndroidMainfest.xml中注册Activity的时候,指明Intent是通过Intent-filter进行的:

    <activity android:name=".MyAty">
            <intent-filter>
                <!--default的行为方式是一个Activity-->
                <category android:name="android.intent.category.DEFAULT"/>
                <action android:name="info.baitian.learnintent.intent.aciton.MyAty"/>
            </intent-filter>
     </activity>

  在要跳转到MyAty这个Activity的时候,可以这样:

    findViewById(R.id.startMyAty).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                    startActivity(new Intent("info.baitian.learnintent.intent.aciton.MyAty"));
            }
        });

  上面这段代码是在我的另一个非MyAty的Activity中有一个id为startMyAty的Button,点击它可以利用Intent到我的MyAty。注:中间的“info.baitian.learnintent.intent.aciton.MyAty”可以是任意字符,只是约定这么写而已。

当然,最好是把上面的字符在我的MyAty.java中创建一个常量ACTION:

public static final String="info.baitian.learnintent.intent.aciton.MyAty";

  这样,Intent就可以这样创建了:

startActivity(new Intent(MyAty.ACTION));

  通过隐式Intent可以跨应用(app)来启动Activity的,但是要是不允许别的app来应用的需要这样:

<activity android:name=".MyAty" android:exported="false">
            <intent-filter>
                <!--default的行为方式是一个Activity-->
                <category android:name="android.intent.category.DEFAULT"/>
                <action android:name="info.baitian.learnintent.intent.aciton.MyAty"/>
            </intent-filter>
        </activity>

  用exported="false"就行了。

 

8、context是用来访问全局信息的接口。一些常用的组件就会继承自Context,方便调用访问:

    private TextView tv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //这里的tv有访问res的能力,就好像具备了layout的性质。
        // 我们知道MainActivity也是继承了Context的。而有了Context就有了访问res的能力。
        tv=new TextView(MainActivity.this);
        tv.setText("HelloAndroid!");

        //不用layout的布局,而是自己创建了一个TextView tv
        //setContentView(R.layout.activity_main);
        setContentView(tv);
    }

  也可以用作实现多个组件之间的信息的共享与桥梁。

 

9、Application,才是真正的全局上下文对象。

 

10、程序的Activity的入口:

        <activity android:name=".Main2">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>    

  注意他的Intent-filter的name是这个就是程序的入口。

 

 11、好几个对象:Application与Activity

 

12、service的使用、绑定与生命周期

exported:是否向外部公开。

启动一个service与启动一个Activity几乎是一模一样的:

findViewById(R.id.btnStartService).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startService(new Intent(MainActivity.this,MyService.class))
            }
        });

  用startService()函数,而启动一个Activity的用startActivity()函数。

关闭一个ServicestopService()

 stopService(new Intent(MainActivity.this,MyService.class));

  不用担心new出来的Intent是不是操作的同一个Service实例。注意:Service实例只能被创建一次。

 

13、onStartCommand()只要启动一次服务就运行一次,而onStart()不管你启动多少次服务(当然你没有stopService),它只是在第一次启动服务的时候跑一次。

 

14、Service通信需要用Intent,当然这是在同一个Service。

要是在不同的Service之间进行数据的传输该怎么办?也能像Activity之间通过Intent-filter的action进行信息的传递吗?答:在Android5.0之前是可以的,但是在Android5.0之后是不可以的。

 

15、Android的权限。用WebView:

在布局里面创建了一个WebView之后,在他的Activity的java中:

private WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);//要注意这里的setContentView()是放在这儿的,不要放到最后
webView= (WebView) findViewById(R.id.wv);
webView.loadUrl("http://www.baitian.info");

}

  这样是不能登录我的URL的,因为没有开通这个程序访问互联网的方法。

<uses-permission android:name="android.permission.INTERNET"/>

  这样就可以登录了。

 

15、fragment的生命周期

onCreate()、onCreateView()、onPause()是重要的。

 

16、Intent是组件之间重要的信使

Intent实现Activity之间的跳转主要有两种方式:

无返回结果的跳转:用startActivity(intent)

有返回结果的跳转:startActivityForResult(intent,requestCode),这个还会用到另外两个函数onActivityResult(int requestCode,int resultCode,Int data),setResult(resultCode,data)

 

17、组件的学习:

改变view的透明度用函数setAlpha(float f)设置。

创建事件的方法有三种:一、匿名内部类;二、外部类;三、implements OnClickListener...实现事件接口

在布局中用gravity表示位置属性;布局的子类控件用layout_gravity表示位置属性;还有weight表示权重的属性。另外:布局可以套用

 

18、添加构造函数(自动添加代码快捷键):

Alt+Insert,选择要添加的内容,是构造函数还是getter+setter

 

19、签名打包

 

20、处于最外层的layout_width和layout_height是没有作用的

 

21、Activity与View(Layout),以及MVC

M Model, V View, C Control,在Android里面View就是 View 类, Control之一就是Activity 类了
首先View不代表一个屏幕,View可以代表一个按钮(ButtonView),一行字(TextView),一个文本框(EditText),也可以代表一个不可见的容器(ViewGroup的子类们),装了一打按钮之类的东西,ViewGroup可以它里面东西的排列显示方式,横着、竖着、可以滚动的,等等,随心所欲。ViewGroup里面可以套ViewGroup,就像俄罗斯套娃,最外面那个才充满整个屏幕。
Acitivity当然代表一个屏幕,但和view的作用不同。看View,不说别的,就onDraw()方法,Activity有吗?Activity连个带draw字的方法都没有,所以它不直接负责显示工作。你看Activity的方法,大部分都处理这些事的,比如触摸、按件、呼出菜单、保存状态、暂停、继续,都是处理程序的。如果你不给Acitvity里面“setContentView",它就没有东西显示。所以Activity就像是个后台打杂的,和前台唱戏的View是互相配合的关系。

 

22、view的事件传递,图参考

view不处理TouchEvent的流程:

view-ignore-touch-event-example

view处理事件的流程:

view-process-touch-event-example

 

23、view的绘制技术

view_draw_method_chain img

measure(int,int)→layout(int,int,int,int)→draw()

measure测出大小,layout测出布局改怎么放,draw()就是画出来。requestLayout()是用户调用,这个过程没有draw()。参考

 

 

-----------问题----------

1、Application与Activity之间的关系

2、安装都是安装的Activity的吗?

3、Service的绑定与解绑

posted @ 2015-08-27 00:10  陈不二  阅读(183)  评论(0编辑  收藏  举报
yes, javascript 拯救世界