android笔记

来源:互联网 发布:mac壁纸 2560x1440 编辑:程序博客网 时间:2024/06/04 17:46

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方法里

@Overrideprotected void onCreate(Bundle arg0) {// TODO Auto-generated method stubsuper.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;@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn null;}private String usercode="";@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {// TODO Auto-generated method stubdao=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()) {@Overridepublic void handleObject(Object arg0) throws Exception {// TODO Auto-generated method stubGrid 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();      }          }              }}







1 0