[安卓]新闻客户端(八) 新闻详情 & 编码 & 推送 & 适配

点击item,弹出信息,在listview里加一个listener,然后intent跳转



要显示的view是什么样,是要和服务器端开发人员沟通,这里直接把json解析,具体的新闻里有个地址,输入到浏览器,不过这里不能是10.0.2.2了,那是模拟器找本机的地址,在浏览器里输入localhost就好,可以看到一个完整的新闻页


调整字体大小

private void showChooseDialog() {
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		String[] items = new String[] { "超大号字体", "大号字体", "正常字体", "小号字体",
				"超小号字体" };
		builder.setTitle("字体设置");
		builder.setSingleChoiceItems(items, mCurrentItem,
				new DialogInterface.OnClickListener() {
					@Override
					public void onClick(DialogInterface dialog, int which) {
						System.out.println("选中:" + which);
						mCurrentChooseItem = which;
					}
				});
		builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int which) {
				WebSettings settings = mWebView.getSettings();
				switch (mCurrentChooseItem) {
				case 0:
					settings.setTextSize(TextSize.LARGEST);
					break;
				case 1:
					settings.setTextSize(TextSize.LARGER);
					break;
				case 2:
					settings.setTextSize(TextSize.NORMAL);
					break;
				case 3:
					settings.setTextSize(TextSize.SMALLER);
					break;
				case 4:
					settings.setTextSize(TextSize.SMALLEST);
					break;
				default:
					break;
				}

				mCurrentItem = mCurrentChooseItem;
			}
		});
		builder.setNegativeButton("取消", null);
		builder.show();
	}	


分享功能,各家都有Android sdk,一家一家来太麻烦,找集成sharesdk平台,比如友盟、mob等

布局里加一个imagebutton

mob上需要注册  输入应用名字并获取key,然后下载解压,双击QuickIntegrater启动,填名称和manifest里的包名,然后确定

将workspace里的文件备份,再将生成的文件复制进去,把很多库拷进来了

F5刷新,manifest里权限、activity信息、assets下XML里的信息(页面里生成的key拷过来)


复制代码,导包

然后这里setNotification废弃了,却没有说明

public class NewsDetialActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
	}
	private void showShare(){
		   ShareSDK.initSDK(this);//这里是此activity的上下文,不是导包
		   OnekeyShare oks = new OnekeyShare(); 
		   /*// 分享时Notification的图标和文字
		   oks.setNotification(R.drawable.ic_launcher, getString(R.string.app_name));*/
		   oks.setText("我是分享文本");
		   oks.setImageUrl("http://f1.sharesdk.cn/imgs/2014/05/21/oESpJ78_533x800.jpg"); 
		   // 启动分享GUI
		   oks.show(this);
		}
}
还有在manifest里添加activity的声明,官网上的文档有老有新,注意区分。

<!-- For SHareSDK -->
        <activity
            android:name="com.mob.tools.MobUIShell"
            android:configChanges="keyboardHidden|orientation|screenSize"
            android:screenOrientation="portrait"
            android:theme="@android:style/Theme.Translucent.NoTitleBar"
            android:windowSoftInputMode="stateHidden|adjustResize" >
            <intent-filter>
                <data android:scheme="tencent100371282" />

                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.BROWSABLE" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

注意,点过的新闻变成灰色,每一个新闻都有一个ID,需要sharedperence,无需给每一个新闻弄一个字段,新闻loading的时候判断一下就好,然后点击后马上变色

首先是refreshlistview的adapter里要改动,这个adapter在TabDetailPager类里

@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			// TODO Auto-generated method stub
			View item_view =null;
			Holder holder = new Holder();	 
			if (convertView==null) {
				  item_view = View .inflate(mActivity, R.layout.list_news_item, null);
				  holder.iv_newpic = (ImageView) item_view.findViewById(R.id.iv_pic);
				  holder.tv_newsitme_title = (TextView) item_view.findViewById(R.id.tv_newsitme_title);
				  holder.tv_newsitme_date = (TextView) item_view.findViewById(R.id.tv_newsitme_date);
 
				  item_view.setTag(holder);				
			}else {
				item_view=convertView;				
				holder = (Holder) item_view.getTag();			 
			}			
			holder.tv_newsitme_title.setText(listnewsData.get(position).title);
			holder.tv_newsitme_date.setText(listnewsData.get(position).pubdate);
			
			//点击时要判断一下,点击过的要变色
		    TabNewsData item = (TabNewsData) getItem(position);
			String ids = PrefUtils.getString(mActivity, "read_ids", "");
			if (ids.contains(item.id)) {
				holder.tv_newsitme_title.setTextColor(Color.GRAY);
			} else {
				holder.tv_newsitme_title.setTextColor(Color.BLACK);
			}
			
			bitmapUtils.display(holder.iv_newpic, listnewsData.get(position).listimage);
			return item_view;
		}			
	}	
然后点击时也要变

 lv_tab_detail_news.setOnItemClickListener(new OnItemClickListener() {
			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				// TODO Auto-generated method stub													
				String title=	mTabDetailData.data.news.get(position-2).title;
				System.out
						.println("TabDetailPager onItemClick()"+position+"/"+title);
				String readid= mTabDetailData.data.news.get(position-2).id;
				String ids = PrefUtils.getString(mActivity, "read_ids", "");	
				
				if (!ids.contains(readid)) {
					ids = ids + readid + ",";
					PrefUtils.setString(mActivity, "read_ids", ids );
				}				
				changeReadState(view);				
				//跳入到新闻页面:				
				Intent intent = new Intent(mActivity, NewsDetialActivity.class);
				intent.putExtra("url",  mTabDetailData.data.news.get(position-2).url);
				mActivity.startActivity(intent);								 
			}       	       	
		});      
        //返回整个listview	
      	return v;
	}
	private void changeReadState(View view) {
		TextView tv_newsitme_title = (TextView) view.findViewById(R.id.tv_newsitme_title);
		tv_newsitme_title.setTextColor(Color.GRAY);
	}


完成activity

public class NewsDetialActivity extends Activity implements OnClickListener{
	private WebView mWebView;
	private ImageButton btnBack;
	private ImageButton btnSize;
	private ImageButton btnShare;
	private ProgressBar pbProgress;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.activity_news_detail);

		mWebView = (WebView) findViewById(R.id.wv_web);
		btnBack = (ImageButton) findViewById(R.id.btn_back);
		btnSize = (ImageButton) findViewById(R.id.btn_size);
		btnShare = (ImageButton) findViewById(R.id.btn_share);

		btnBack.setOnClickListener(this);
		btnSize.setOnClickListener(this);
		btnShare.setOnClickListener(this);

		pbProgress = (ProgressBar) findViewById(R.id.pb_progress);

		String url = getIntent().getStringExtra("url");

		WebSettings settings = mWebView.getSettings();
		settings.setJavaScriptEnabled(true);  //支持js
		settings.setBuiltInZoomControls(true);//显示放大缩小按钮
		settings.setUseWideViewPort(true);// 支持双击缩放
		
		mWebView.setWebViewClient(new WebViewClient() {
			/**
			 *网页开始加载
			 */
			@Override
			public void onPageStarted(WebView view, String url, Bitmap favicon) {
				// TODO Auto-generated method stub
				super.onPageStarted(view, url, favicon);
				System.out.println("网页开始加载");
				pbProgress.setVisibility(View.VISIBLE);
			}
			/**
			 *网页加载结束
			 */
			@Override
			public void onPageFinished(WebView view, String url) {
				super.onPageFinished(view, url);
				System.out.println("网页加载结束");
				pbProgress.setVisibility(View.GONE);
			}
			/**
			 * 所有跳转的链接都会在此方法中回调
			 */
			@Override
			public boolean shouldOverrideUrlLoading(WebView view, String url) {
				// tel:110
				System.out.println("跳转url:" + url);
				view.loadUrl(url);

				return true;
				// return super.shouldOverrideUrlLoading(view, url);
			}
		});  
		mWebView.loadUrl(url);
	}
	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		switch (v.getId()) {
			case R.id.btn_back:
				finish();
				break;
			case R.id.btn_size:
			    showChooseDialog();
				break;
			case R.id.btn_share:
				showShare();
				break;
			default:
				break;	 
		}
	}
	
	private int mCurrentChooseItem;// 记录当前选中的item, 点击确定前
	private int mCurrentItem = 2;//记录当前选中的item, 点击确定后
	/**
	 * 设置字体
	 */
	private void showChooseDialog() {
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		String[] items = new String[] { "超大号字体", "大号字体", "正常字体", "小号字体",
				"超小号字体" };
		builder.setTitle("字体设置");
		builder.setSingleChoiceItems(items, mCurrentItem,
				new DialogInterface.OnClickListener() {
					@Override
					public void onClick(DialogInterface dialog, int which) {
						System.out.println("选中:" + which);
						mCurrentChooseItem = which;
					}
				});
		builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int which) {
				WebSettings settings = mWebView.getSettings();
				switch (mCurrentChooseItem) {
				case 0:
					settings.setTextSize(TextSize.LARGEST);
					break;
				case 1:
					settings.setTextSize(TextSize.LARGER);
					break;
				case 2:
					settings.setTextSize(TextSize.NORMAL);
					break;
				case 3:
					settings.setTextSize(TextSize.SMALLER);
					break;
				case 4:
					settings.setTextSize(TextSize.SMALLEST);
					break;
				default:
					break;
				}

				mCurrentItem = mCurrentChooseItem;
			}
		});
		builder.setNegativeButton("取消", null);
		builder.show();
	}	
	private void showShare(){
		   ShareSDK.initSDK(this);//这里是此activity的上下文,不是导包
		   OnekeyShare oks = new OnekeyShare(); 
		   /*// 分享时Notification的图标和文字
		   oks.setNotification(R.drawable.ic_launcher, getString(R.string.app_name));*/
		   oks.setText("我是分享文本");
		   oks.setImageUrl("http://f1.sharesdk.cn/imgs/2014/05/21/oESpJ78_533x800.jpg"); 
		   // 启动分享GUI
		   oks.show(this);
		}	
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/title_red_bg" >
        <ImageButton
            android:id="@+id/btn_back"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_marginLeft="5dp"
            android:background="@null"
            android:src="@drawable/back" />
        <ImageButton
            android:id="@+id/btn_share"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:layout_marginRight="5dp"
            android:background="@null"
            android:src="@drawable/icon_share" />
        <ImageButton
            android:id="@+id/btn_size"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_marginRight="5dp"
            android:layout_toLeftOf="@id/btn_share"
            android:background="@null"
            android:src="@drawable/icon_textsize" />
    </RelativeLayout>

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" >
        <WebView
            android:id="@+id/wv_web"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
        <ProgressBar
            android:id="@+id/pb_progress"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:indeterminateDrawable="@drawable/custom_progress" />
    </FrameLayout>
</LinearLayout>


pref工具里面加上

public static String getString(Context ctx, String key,
			String defaultValue) {
		SharedPreferences sp = ctx.getSharedPreferences(PREF_NAME,
				Context.MODE_PRIVATE);
		return sp.getString(key, defaultValue);
	}

	public static void setString(Context ctx, String key, String value) {
		SharedPreferences sp = ctx.getSharedPreferences(PREF_NAME,
				Context.MODE_PRIVATE);
		sp.edit().putString(key, value).commit();
	}

分享页面全屏,这要在show里面改

private void showShare(){
		   ShareSDK.initSDK(this);//这里是此activity的上下文,不是导包
		   OnekeyShare oks = new OnekeyShare(); 
		   /*// 分享时Notification的图标和文字
		   oks.setNotification(R.drawable.ic_launcher, getString(R.string.app_name));*/
		   oks.setText("我是分享文本");
		   oks.setImageUrl("http://f1.sharesdk.cn/imgs/2014/05/21/oESpJ78_533x800.jpg"); 
		   oks.setTheme(OnekeyShareTheme.SKYBLUE);//全屏蓝底
		   // 启动分享GUI
		   oks.show(this);
		}	


在分享的时候,如果要显示来自。。。。的分享,需要在对应的sdk平台注册开发者账号,并拿到key,在sdk.xml里添上相应代码,这样分享基本搞定


集成这个sdk后会有乱码的可能

一般都是utf-8的编码,如果当初创建的是本地编码,集成的sdk里会报错,为了不报错,这里可以更改本APP的编码,但是此时就会有一些乱码什么的

要么就是在sdk里改,要么在自己的代码里改,很多是无法识别的字符 成了空格什么的,把不识别的代码和注释里的汉字弄到一块了,换一行可能正常了



组图功能的实现

需要一个layout,listview实现大图的填充,需要解析json,然后到底加载什么的都一样

bean里格式化

public class PhotosData {
	public int retcode;
	public PhotosInfo data;

	public class PhotosInfo {
		public String title;
		public ArrayList<PhotoInfo> news;
	}

	public class PhotoInfo {
		public String id;
		public String listimage;
		public String pubdate;
		public String title;
		public String type;
		public String url;
	}
}
global里定义URL

public class GlobalContants {
	//public static final String SERVER_URL = "http://192.168.1.105:8080/java";
	public static final String SERVER_URL = "http://10.0.2.2:8080/zhbj";
	public static final String CATEGORIES_URL = SERVER_URL + "/categories.json";
	public static final String PHOTOS_URL = SERVER_URL+"/photos/photos_1.json";// 获取组图信息的接口
}
完成photo
public class PhotoMenuDetailPager extends BaseMenuDetailPager {
	private ListView lvPhoto;
	private GridView gvPhoto;
	private ArrayList<PhotoInfo> mPhotoList;
	private PhotoAdapter mAdapter;
	private ImageButton btnPhoto;
	
	public PhotoMenuDetailPager(Activity activity) {
		super(activity);
	}
	public PhotoMenuDetailPager(Activity activity, ImageButton btnPhoto) {
		super(activity);

		this.btnPhoto = btnPhoto;

		btnPhoto.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				changeDisplay();
			}
		});
	}

	@Override
	public View initViews() {	
		View view = View.inflate(mActivity, R.layout.menu_photo_pager, null);
		lvPhoto = (ListView) view.findViewById(R.id.lv_photo);
		gvPhoto = (GridView) view.findViewById(R.id.gv_photo);
		return view;
	}
	@Override
	public void initData() {
		getDataFromServer();
	}
	private void getDataFromServer() {
		HttpUtils utils = new HttpUtils();
		utils.send(HttpMethod.GET, GlobalContants.PHOTOS_URL,
				new RequestCallBack<String>() {
					@Override
					public void onSuccess(ResponseInfo<String> responseInfo) {
						String result = (String) responseInfo.result;
						parseData(result);					 
					}
					@Override
					public void onFailure(HttpException error, String msg) {
						Toast.makeText(mActivity, msg, Toast.LENGTH_SHORT)
								.show();
						error.printStackTrace();
					}
				});
	}
	protected void parseData(String result) {
		Gson gson = new Gson();
		PhotosData data = gson.fromJson(result, PhotosData.class);
		mPhotoList = data.data.news;// 获取组图列表集合
		if (mPhotoList != null) {
			mAdapter = new PhotoAdapter();
			lvPhoto.setAdapter(mAdapter);
			gvPhoto.setAdapter(mAdapter);
		}
	}
	class PhotoAdapter extends BaseAdapter {
		private BitmapUtils utils;	
    	public PhotoAdapter() {
			utils = new BitmapUtils(mActivity);
			utils.configDefaultLoadingImage(R.drawable.news_pic_default);		 
		}
		@Override
		public int getCount() {
			return mPhotoList.size();
		}
		@Override
		public PhotoInfo getItem(int position) {
			return mPhotoList.get(position);
		}
		@Override
		public long getItemId(int position) {
			return position;
		}
		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			ViewHolder holder;
			if (convertView == null) {
				convertView = View.inflate(mActivity, R.layout.list_photo_item,
						null);
				holder = new ViewHolder();
				holder.tvTitle = (TextView) convertView
						.findViewById(R.id.tv_title);
				holder.ivPic = (ImageView) convertView
						.findViewById(R.id.iv_pic);
				convertView.setTag(holder);
			} else {
				holder = (ViewHolder) convertView.getTag();
			}
			PhotoInfo item = getItem(position);
			holder.tvTitle.setText(item.title);
			utils.display(holder.ivPic, item.listimage);
			return convertView;
		}
	}
    static class ViewHolder {
		public TextView tvTitle;
		public ImageView ivPic;
	}
	private boolean isListDisplay = true;// 是否是列表展示
	/**
	 * 切换展现方式
	 */
	private void changeDisplay() {
		if (isListDisplay) {
			isListDisplay = false;
			lvPhoto.setVisibility(View.GONE);
			gvPhoto.setVisibility(View.VISIBLE);
			btnPhoto.setImageResource(R.drawable.icon_pic_list_type);
		} else {
			isListDisplay = true;
			lvPhoto.setVisibility(View.VISIBLE);
			gvPhoto.setVisibility(View.GONE);
			btnPhoto.setImageResource(R.drawable.icon_pic_grid_type);
		}
	}
}


列图模式,gridview,然后点button,两种模式来回切,毫无卡顿感,实际上使用帧布局,把listview和gridview放在一块了,隐藏其中一个

需要在basepager里找到button

public void initViews() {
		mRootView = View.inflate(mActivity,R.layout.base_pager, null);

		tvTitle = (TextView) mRootView.findViewById(R.id.tv_title);
		flContent = (FrameLayout) mRootView.findViewById(R.id.fl_content);
		//组图切换
		btnPhoto = (ImageButton) mRootView.findViewById(R.id.btn_photo);
布局里加上button

 <ImageButton
            android:id="@+id/btn_photo"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:layout_marginRight="5dp"
            android:background="@null"
            android:src="@drawable/icon_pic_grid_type"
            android:visibility="gone" />

newsCenterPager实现模式的切换

public void setCurrentMenuDetailPager(int position) {
		//在这个pager里面的flcontent(帧布局)里面增加一个布局		
		 BaseMenuDetailPager baseMenuDetailPager = mPagers.get(position);
		 flContent.removeAllViews();// 清除之前的布局
		 flContent.addView( baseMenuDetailPager.mRootView);
		
		 baseMenuDetailPager.initData();// 初始化当前页面的数据
		 //两种模式的切换
		 if (baseMenuDetailPager instanceof PhotoMenuDetailPager) {
				btnPhoto.setVisibility(View.VISIBLE);
			} else {
				btnPhoto.setVisibility(View.GONE);
			}
布局里加上一个grid,和list并存

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <ListView
        android:id="@+id/lv_photo"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:cacheColorHint="#fff"
        android:divider="@null" />
    <GridView
        android:id="@+id/gv_photo"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:numColumns="2"
        android:visibility="gone" />
</FrameLayout>

list

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:background="@drawable/pic_list_item_bg"
        android:gravity="center"
        android:orientation="vertical" >
        <ImageView
            android:id="@+id/iv_pic"
            android:layout_width="match_parent"
            android:layout_height="180dp"
            android:scaleType="centerCrop"
            android:src="@drawable/news_pic_default" />
        <TextView
            android:id="@+id/tv_title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="10dp"
            android:text="标题"
            android:singleLine="true"
            android:textColor="#000"
            android:textSize="22sp" />
    </LinearLayout>
</LinearLayout>



jpush

注册APP


集成

备份,导入jar包

将armeabi这个包含底层库的包复制进lib,还有一个armeabi-v7a同样

manifest配置

注意,其中需要手动修改的地方,包括key

写一个继承application的类,其中是一些初始化的内容,拷进来的,application里的oncreate比activity例的先执行,需要去manifest里声明


这样子就基本绑定了


客户端sdk

message是由消息显示,注册一个receiver,可以带上一个URL,这样子,可以点击通知栏的信息后跳转出来,交给一个activity,显示详细信息什么的,大概就这样

public class MyReceiver extends BroadcastReceiver {

	private static final String TAG = "JPush";

	@Override
	public void onReceive(Context context, Intent intent) {
        Bundle bundle = intent.getExtras();
		Log.d(TAG, "[MyReceiver] onReceive - " + intent.getAction() + ", extras: " + printBundle(bundle));
		
        if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) {
            String regId = bundle.getString(JPushInterface.EXTRA_REGISTRATION_ID);
            Log.d(TAG, "[MyReceiver] 接收Registration Id : " + regId);
            //send the Registration Id to your server...
                        
        } else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) {
        	Log.d(TAG, "[MyReceiver] 接收到推送下来的自定义消息: " + bundle.getString(JPushInterface.EXTRA_MESSAGE));
        
        } else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) {
            Log.d(TAG, "[MyReceiver] 接收到推送下来的通知");
            int notifactionId = bundle.getInt(JPushInterface.EXTRA_NOTIFICATION_ID);
            Log.d(TAG, "[MyReceiver] 接收到推送下来的通知的ID: " + notifactionId);
        	
        } else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) {
            Log.d(TAG, "[MyReceiver] 用户点击打开了通知");
                 	
        } else if (JPushInterface.ACTION_RICHPUSH_CALLBACK.equals(intent.getAction())) {
            Log.d(TAG, "[MyReceiver] 用户收到到RICH PUSH CALLBACK: " + bundle.getString(JPushInterface.EXTRA_EXTRA));
            //在这里根据 JPushInterface.EXTRA_EXTRA 的内容处理代码,比如打开新的Activity, 打开一个网页等..
        	
        } else if(JPushInterface.ACTION_CONNECTION_CHANGE.equals(intent.getAction())) {
        	boolean connected = intent.getBooleanExtra(JPushInterface.EXTRA_CONNECTION_CHANGE, false);
        	Log.w(TAG, "[MyReceiver]" + intent.getAction() +" connected state change to "+connected);
        } else {
        	Log.d(TAG, "[MyReceiver] Unhandled intent - " + intent.getAction());
        }
	}


另一种通知,不在用户界面上通知,比如微信,不主动push消息,但是每当你进去后,如果有留言、赞什么的,就已经初始化好了,这就是后台有一个service,接到push来的消息,直接在后台初始化了,用户就能进去看到


服务器端页游sdk,在有大量信息push的时候,比较省事,不用自己去手动一条一条的添加



适配:

图片适配

一套图多准备几种分辨率的,会自动适配不同分辨率的机子


drawable-ldpi 240*320
drawable-mdip 320*480
drawable-hdpi 480*800
drawable-xhdpi 1280*720 
drawable-xxhdpi 1920*1280
系统找图的原则是:优先向上找图,如果上面所有的分辨率都没有找到,再往下找
但是:不常用。
原因是? 图片切很多套很占空间。而且增加美工的工作量。


布局适配

在不同分辨率的手机上,去找对应分辨率下面的布局文件。根据该布局文件去绘制页面。

建立多个布局文件,乘号是x而不是*,另外哪个大哪个在前,而不是规定宽在前或者高在前


效果不太好,低分辨率的比较稀疏,高分辨率很密集,否则就容易出现高分辨率的很空旷,低分辨率的屏幕被占满


尺寸适配

dp= px / 屏幕密度


drawable-ldpi 240*320  屏幕密度 0.75         //120pix   --->  160dp *0.75 =120 px
drawable-mdip 320*480  屏幕密度 1.0            dp=px
drawable-hdpi 480*800  屏幕密度 1.5           //240pix  ---》   160dp *1.5 = 240px

getsource().getDisplayMetries().density可获取密度

trise

权重适配

layout_weight非常好用,写一个weightSum=3 剩下两个空间都写1,则各占三分之一


代码适配

int height = getWindowManager().getDefaultDisplay().getHeight();
		int width = getWindowManager().getDefaultDisplay().getWidth();
		
		TextView tv1 = (TextView) findViewById(R.id.tv1);
		TextView tv2 = (TextView) findViewById(R.id.tv2);
		
		LayoutParams params = new LayoutParams(width/2, LayoutParams.WRAP_CONTENT);
		tv1.setLayoutParams(params);
		tv2.setLayoutParams(params);

之前在splash里的小灰点写的像素值

可以写一个工具类,将像素转成dp

public  static int Dp2Pix(Context ctx, int dp){
		int px=0;
		
	    float density = ctx.getResources().getDisplayMetrics().density;
	    px= (int )  (dp*density+0.5f);  // 4.9 -->4  4.4->4
		return px;
	}



另外有一个问题,在不同分辨率的机子上,侧边栏的button什么的大小不合适

main里面应该是计算得到,之前写死了

private void initSlidingMenu() {
		// 第一步(2) 找到侧边栏
		setBehindContentView(R.layout.activity_behind);	
		//第一步(3) get一个SlidingMenu实例
		SlidingMenu menu = getSlidingMenu();	
		//第一步(4) set出触摸方式和边距,都是必须
		menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN);
		menu.setBehindOffset(220);//这里应该通过计算得到
	}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值