替代资源:
如果程序需要为特定的设备配置提供替代的资源支持,如需要为不同屏幕提供代替的图片资源,为不同语言提供替代的字符串资源,运行时android会检查设备配置并为应用程序加载合适的资源;
步骤:
- res/下创建新目录,<resource_name>_<config_qualifier>方式命名, resources_name 是上表中提到的任意资源,如布局、图片等。 qualifier 将确定个性的配置使用哪些资源。可以查看官方文档来了解不同类型资源的一个完整 qualifier 列表。
- 目录中保存响应的替代资源,利用这些文件将确定的内容进行替代。虽然图片的文件名一样,但是高分辨率的屏幕,图片的分辨率也会高
访问资源
代码中访问
当 Android 应用程序被编译,生成一个 R 类,其中包含了所有 res/ 目录下资源的 ID。你可以使用 R 类,通过子类+资源名或者直接使用资源 ID 来访问资源
//访问 res/drawable/myimage.png,并将其设置到 ImageView 上
//用 R.id.myimageview 来在布局文件中获取定义为 myimageview 的 ImageView
ImageView imageView = (ImageView) findViewById(R.id.myimageview);
//用R.drawable.myimage 来获取在 res/ 的 drawable 子目录下名为 myimage 的图片
imageView.setImageResource(R.drawable.myimage);
例子二:
// res/values/strings.xml 有如下定义
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello, World!</string>
</resources>
//可在 ID 为 msg 的 TextView 对象上使用资源 ID 来设置文本:
TextView msgTextView = (TextView) findViewById(R.id.msg);
msgTextView.setText(R.string.hello);
实例三:
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
//R.layout.main,就是在R.java中的R类定义的layout中main,格式为:R.layout.<layout的xml文件名字>,就是对应的res/layout/activity_main.xml文件。
setContentView(R.activity_main.main);
TextView myTextView = (TextView) findViewById(R.id.text);
myTextView.setText("我的Activity");
//@+id/button
Button myButton = (Button) findViewById(R.id.button);
myButton.setText("我的按钮");
}
在xml中访问
<?xml version="1.0" encoding="utf-8"?>
<resources>
//颜色资源和一个字符串资源
<color name="opaque_red">#f00</color>
<string name="hello">Hello!</string>
</resources>
//布局文件中使用这些资源来设置文本颜色和文本内容
<?xml version="1.0" encoding="utf-8"?>
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:textColor="@color/opaque_red"
android:text="@string/hello" />
Android获得activity
一个具有用户界面的单一屏幕:java窗口或帧
android活动是ContextThemeWrapper 类的子类
Android 系统初始化程序是通过活动中的 onCreate() 回调的调用开始的
存在有一序列的回调方法来启动一个活动,同时有一序列的方法来关闭活动
生命周期:
实例
在主要活动文件src/com.example.helloworld/MainActivity.java修改的内容,Log.d()方法用来生成日志信息,包含每一个基本的生命周期方法
package com.example.phoebem.myapplication;
import android.annotation.SuppressLint;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
public class MainActivity extends AppCompatActivity {
String msg = "Android : ";
/** 当活动第一次被创建时调用 */
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 从res/activity_main 中的XML文件加载所有的UI组件
setContentView(R.layout.activity_main);
Log.d(msg, "The onCreate() event");
}
/** 当活动即将可见时调用 */
@Override
protected void onStart() {
super.onStart();
Log.d(msg, "The onStart() event");
}
/** 当活动可见时调用 */
@Override
protected void onResume() {
super.onResume();
Log.d(msg, "The onResume() event");
}
/** 当其他活动获得焦点时调用 */
@Override
protected void onPause() {
super.onPause();
Log.d(msg, "The onPause() event");
}
/** 当活动不再可见时调用 */
@Override
protected void onStop() {
super.onStop();
Log.d(msg, "The onStop() event");
}
/** 当活动将被销毁时调用 */
@Override
public void onDestroy() {
super.onDestroy();
Log.d(msg, "The onDestroy() event");
}
}
这个世界上厉害的人总是辣么多 辣么多
android服务service
服务是一个即使应用被销毁依然可以在后台运行的组件:执行长时间运行且不需要和用户交互的任务;
服务的状态:
started:程序组件如活动,通过starttService启动了服务,则服务是此状态,一旦启动,服务可无期限运行,即使启动它的组件已被销毁;
bound: 程序组件通过bindService绑定了服务,则是此状态;该状态的服务提供了一个客户服务器接口来容许组件与服务交互
http://www.runoob.com/android/android-services.html
//res/values/strings.xml 定义两个新的常量 哪里用到了???
<string name="menu_settings">Settings</string>
<string name="action_settings">Settings</string>
android广播接收器broadcast receivers
响应来自其他应用或系统的广播消息(也称事件或意图),可定义适当动作来拦截这些通信
步骤:使系统广播意图配合广播接收器工作
创建
实现BroadcastReceiver类,重写onReceive来接收以Intent对象为参数的消息。
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show();
}
}
注册
在AndroidManifest.xml中注册广播接收器来监听制定的广播意图
无论什么时候Android设备被启动,都将被广播接收器MyReceiver所拦截,并且在onReceive()中实现的逻辑将被执行。
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
//注册MyReceiver
<receiver android:name="MyReceiver">
//监听系统产生的ACTION_BOOT_COMPLETED事件
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED">
</action>
</intent-filter>
</receiver>
</application>
重要的系统事件:定义为类Intent中的静态常量值
事件常量 | 描述 |
---|---|
android.intent.action.BATTERY_CHANGED | 持久的广播,包含电池的充电状态,级别和其他信息。 |
android.intent.action.BATTERY_LOW | 标识设备的低电量条件。 |
android.intent.action.BATTERY_OKAY | 标识电池在电量低之后,现在已经好了。 |
android.intent.action.BOOT_COMPLETED | 在系统完成启动后广播一次。 |
android.intent.action.BUG_REPORT | 显示报告bug的活动。 |
android.intent.action.CALL | 执行呼叫数据指定的某人。 |
android.intent.action.CALL_BUTTON | 用户点击"呼叫"按钮打开拨号器或者其他拨号的合适界面。 |
android.intent.action.DATE_CHANGED | 日期发生改变。 |
android.intent.action.REBOOT | 设备重启。 |
广播自定义意图:
活动类中通过sendBroadcast()来创建并发送这些自定义意图
sendStickyBroadcast(Intent)持久的(sticky),发出的意图在广播完成后一直保持着
实例:创建广播接收器来拦截自定义意图
应用程序可以处理一个或多个自定义或者系统的意图,没有任何限制。每个你想拦截的意图都需要使用<receiver.../>标签在AndroidManifest.xml中注册
还需要继续学习