android笔记

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();
      			}
          }
          
    }

}



 


 



 

posted @ 2016-10-15 18:57  海的心  阅读(124)  评论(0编辑  收藏  举报