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()函数。
关闭一个Service用stopService():
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处理事件的流程:
23、view的绘制技术
measure(int,int)→layout(int,int,int,int)→draw()
measure测出大小,layout测出布局改怎么放,draw()就是画出来。requestLayout()是用户调用,这个过程没有draw()。参考
-----------问题----------
1、Application与Activity之间的关系
2、安装都是安装的Activity的吗?
3、Service的绑定与解绑