1、Activity和FragmentActivity
import android.app.Activity;
public class WelcomeActivity extends Activity {
import android.support.v4.app.FragmentActivity;
public class WelcomeActivity extends FragmentActivity {
fragmentactivity 继承自activity,提供了操作fragment的一些方法,用来解决android3.0 之前没有fragment的api,所以在使用的时候需要导入android-support-v4.jar兼容包,
同时继承fragmentActivity,这样在activity中就能嵌入fragment来实现你想要的布局效果。
2、Bundle
Bundle很容易可以发现会作为参数出现在每一个activity类中重写父类的onCreate方法里
@Override
protected void onCreate(Bundle arg0) {
// TODO Auto-generated method stub
super.onCreate(arg0);
通过研究Activity源码
protected void onCreate(Bundle savedInstanceState) {
if (DEBUG_LIFECYCLE) Slog.v(TAG, "onCreate " + this + ": " + savedInstanceState);
if (mLastNonConfigurationInstances != null) {
mAllLoaderManagers = mLastNonConfigurationInstances.loaders;
}
if (mActivityInfo.parentActivityName != null) {
if (mActionBar == null) {
mEnableDefaultActionBarUp = true;
} else {
mActionBar.setDefaultDisplayHomeAsUpEnabled(true);
}
}
if (savedInstanceState != null) {
Parcelable p = savedInstanceState.getParcelable(FRAGMENTS_TAG);
mFragments.restoreAllState(p, mLastNonConfigurationInstances != null
? mLastNonConfigurationInstances.fragments : null);
}
mFragments.dispatchCreate();
getApplication().dispatchActivityCreated(this, savedInstanceState);
mCalled = true;
}
可以发现每一个自定义的activity类都会回调父类的onCreate方法
super.onCreate(arg0);
而且需写在第一行,完成一些像窗口初始化的工作。Bundle类是一个final类,封装一些key-value键值对,比较常用于两个activity之间的通讯,而activity之间的通讯通常是借助Intent类。
3、SharedPreferences
SharedPreferences也是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息。其存储位置在/data/data/<包名>/shared_prefs目录下。
SharedPreferences sp;
SharedPreferences.Editor editor;
sp=WelcomeActivity.this.getSharedPreferences("sharedata", Context.MODE_PRIVATE);
editor= sp.edit();
editor.putString("name", "name");
editor.putString("pass", "pass");
editor.commit();
运行后会生成对应的SharedPreferences数据存储文件sharedate.xml
sharedata.xml内容则是所设置的vey-value
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="name">name</string>
<string name="pass">pass</string>
</map>
SharedPreferences常用的属性和方法
public abstract boolean contains (String key):判断SharedPreferences是否包含特定key的数据
public abstract SharedPreferences.Editor edit ():返回一个Edit对象用于操作SharedPreferences
public abstract Map<String, ?> getAll ():获取SharedPreferences数据里全部的key-value对
getXXX(String key,XXX defvlaue):获取SharedPreferences数据指定key所对应的value,如果该key不存在,返回默认值defValue。其中XXX可以是boolean、float、int、long、String等基本类型的值
Editor接口的常用方法
public abstract SharedPreferences.Editor clear ():清空SharedPreferences里所有的数据
public abstract boolean commit ():当Editor编辑完成后,调用该方法可以提交修改,而且必须要调用这个数据才修改
public abstract SharedPreferences.Editor putXXX (String key, boolean XXX):向SharedPreferences存入指定的key对应的数据,其中XXX可以是boolean、float、int、long、String等基本类型的值
public abstract SharedPreferences.Editor remove (String key):删除SharedPreferences里指定key对应的数据项
Context.getSharedPreferences(String name,int mode):得到一个SharedPreferences实例
name:是指文件名称,不需要加后缀.xml,系统会自动为我们添加上。一般这个文件存储在/data/data/<package name>/shared_prefs下
mode:是指定读写方式,其值有三种,分别为:
Context.MODE_PRIVATE:指定该SharedPreferences数据只能被本应用程序读、写
Context.MODE_WORLD_READABLE:指定该SharedPreferences数据能被其他应用程序读,但不能写
Context.MODE_WORLD_WRITEABLE:指定该SharedPreferences数据能被其他应用程序读写。
4、service
android中服务是运行在后台的东西,级别与activity差不多。既然说service是运行在后台的服务,那么它就是不可见的,没有界面的东西。你可以启动一个服务Service来播放音乐,或者记录你地理信息位置的改变,或者启动一个服务来运行并一直监听某种动作。
Service 可以想象成一种消息服务,而你可以在任何有 Context 的地方调用 Context.startService、Context.stopService、Context.bindService,Context.unbindService,来控制它。
Service分:本地服务(Local)、远程服务(Remote),本地服务依附在主进程上,主进程被Kill后,服务便会终止,如音乐播放服务。远程服务是独立的进程,如一些提供系统服务的Service,这种Service是常驻的,占用一定资源。
和Thread的关系,Thread 的运行是独立于 Activity 的,也就是说当一个 Activity 被 finish 之后,如果你没有主动停止 Thread 或者 Thread 里的 run 方法没有执行完毕的话,Thread 也会一直执行。因此这里会出现一个问题:当 Activity 被 finish 之后,你不再持有该 Thread 的引用。另一方面,你没有办法在不同的 Activity 中对同一 Thread 进行控制。
常用原型方法:onCreate()--创建、onStart--开始、onDestry()--释放。
以一个后台推送消息为例
Intent i=new Intent(HomeActivity.this,PushMessageService.class);
i.putExtra("userCode", "userCode");
//消息推送
startService(i);
public class PushMessageService extends Service{
//获取消息线程
private MessageThread messageThread = null;
//点击查看
private Intent messageIntent = null;
private PendingIntent messagePendingIntent = null;
//通知栏消息
public static int messageNotificationID = 1000;
private Notification messageNotification = null;
public NotificationManager messageNotificationManager = null;
private int pagesize = 10;
private int currentPage = 1;
private RequestHandler handler;
private String message=null;
private MessagesDao dao;
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
private String usercode="";
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
dao=new MessagesDao(PushMessageService.this);
setHandler();
messageNotificationManager = (NotificationManager)getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
messageNotification= new Notification();
messageNotification.icon = R.drawable.icon;
messageNotification.tickerText = "新消息";
messageNotification.defaults = Notification.DEFAULT_SOUND;
messageNotification.audioStreamType = android.media.AudioManager.ADJUST_LOWER;
usercode=intent.getStringExtra("userCode");
//单击查看
// messageIntent= new Intent(this, TaskListActivity.class);
// messageIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
// messagePendingIntent= PendingIntent.getActivity(this, 0, messageIntent, PendingIntent.FLAG_ONE_SHOT);
//开启线程通知
MessageThread thread=new MessageThread();
thread.isRunning=true;
thread.start();
return super.onStartCommand(intent, flags, startId);
}
private void setHandler(){
//final String message=null;
handler=new RequestObjectHandler<Grid>(getApplicationContext()) {
@Override
public void handleObject(Object arg0) throws Exception {
// TODO Auto-generated method stub
Grid grid = (Grid) arg0;
List< Map<String,Object>> list =(List< Map<String,Object>>)grid.getList();
if(list!=null){
for(Map<String,Object>m:list){
String message=m.get("content")+"";
String date_str = m.get("ftime")+"";
int state = Integer.parseInt(m.get("state")+"");
String msg_id = m.get("id")+"";
Log.i("sqlite", m.toString());
if(!StringUtil.isNnull(message)){
dao.insertMsgData(msg_id, message, date_str,state);
}
}
//点击查看
// messageIntent= new Intent(getApplicationContext(), TaskListActivity.class);
// messageIntent.putExtra("message", message);
// messageIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
// messagePendingIntent= PendingIntent.getActivity(getApplicationContext(), 0, messageIntent, PendingIntent.FLAG_ONE_SHOT);
}
}
};
}
@SuppressLint("NewApi")
class MessageThread extends Thread{
//运行状态
public boolean isRunning = true;
@Override
public void run() {
while(isRunning){
try {
getMessage();
//休息10秒
Thread.sleep(10000);
if(message!=null){
//设置消息内容和标题
NotificationCompat.Builder builder = new NotificationCompat.Builder(getApplicationContext());
builder.setContentTitle("您有新消息!");
builder.setContentText(message);
messageNotification = builder.build();
//发布消息
messageNotificationManager.notify(messageNotificationID, messageNotification);
//避免覆盖消息,采取ID自增
messageNotificationID++;
message=null;
}
Thread.sleep(10000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
//获取服务器消息
public void getMessage(){
try{
String username=usercode;//"15915728259";//shareUtil.getValue(SharedPreferencesUtil.STR_USERCODE);
Integer state=0;
Map<String, Object> params = new HashMap<String, Object>();
params.put("pageSize", pagesize);
params.put("currentpage", currentPage);
params.put("users", username);
params.put("state", state);
params.put("role", "app");
String url = Config.getUrl("getSimpleMessage_url");
Request.post(url, params, handler,"");
}catch(Exception e){
//Toast.makeText(HomeActivity.this, "22222", Toast.LENGTH_SHORT).show();
}
}
}
}