malong26 发表于 2013-2-3 11:29:46

模仿iphone弹出式短信查看

感觉使用抽屉查看短信麻烦,于是自己写了一个模仿iphone查看的短信的小程序,自己用,挺好的。实现原理主要是activity的背景半透明,加上收到短信开启服务和桌面图标开启服务。目前只做了收到1条短信显示,如果是长短信和连续短信的话没有做处理,废话少说,附件是源码和截图。
popSMS.java 闪屏,首次开启应用显示
package com.smsshow;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.os.Handler;public class popSMS extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.start_page);new Handler().postDelayed(new Runnable() {public void run() {startService(new Intent(popSMS.this, MyService.class));popSMS.this.finish();}}, 2000);}}
注:此Receiver无用,但是贴上提醒一下童鞋们
BootBroadcastReceiver.java 本来的想法是开机开启服务,但是某些rom比如htc,lenovo是不公开BOOT_COMPLETED广播的,我们自己的应用接收不到,所以我使用了收到短信开启服务
package com.smsshow;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.util.Log;public class BootBroadcastReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {// TODO Auto-generated method stub//if(intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)){Log.i("tag","get boot completed action");Intent serviceIntent = new Intent();serviceIntent.setClass(context, MyService.class);context.startService(serviceIntent);//}}}

MyService.java 接收短信服务
package com.smsshow;import android.app.Service;import android.content.BroadcastReceiver;import android.content.ContentResolver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.database.Cursor;import android.net.Uri;import android.os.AsyncTask;import android.os.Bundle;import android.os.IBinder;import android.telephony.SmsMessage;import android.util.Log;public class MyService extends Service {BroadcastReceiver mReceiver;@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {// TODO Auto-generated method stubmReceiver = new SMSReceive();IntentFilter filter = new IntentFilter();filter.addAction("android.provider.Telephony.SMS_RECEIVED");registerReceiver(mReceiver, filter);return super.onStartCommand(intent, flags, startId);}@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubLog.i("tag", "my sms service is on!");return null;}private void showMsg(String title, String message) {Intent startIntent = new Intent();startIntent.setClass(this, SmsShowActivity.class);startIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);startIntent.putExtra("title", title);startIntent.putExtra("message", message);startActivity(startIntent);}class InnerTask extends AsyncTask<String, Object, Object> {String contectId;String msgNumber;String msgBody;@Overrideprotected Object doInBackground(String... params) {// TODO Auto-generated method stubmsgNumber = params;msgBody = params;contectId = getContactIDFromPhoneNum(msgNumber);return null;}@Overrideprotected void onPostExecute(Object result) {// TODO Auto-generated method stubif (contectId == null) {showMsg(msgNumber, msgBody);} else {showMsg(contectId, msgBody);}super.onPostExecute(result);}public String getContactIDFromPhoneNum(String phoneNum) {String contactName = null;ContentResolver resolver = MyService.this.getContentResolver();Uri uri = Uri.parse("content://com.android.contacts/data/phones/filter/"+ phoneNum);Cursor c = resolver.query(uri, new String[] { "display_name" },null, null, null);while (c.moveToNext()) {contactName = c.getString(0);}Log.i("tag", "contactname" + contactName);return contactName;}}@Overridepublic void onDestroy() {// TODO Auto-generated method stubunregisterReceiver(mReceiver);super.onDestroy();}class SMSReceive extends BroadcastReceiver {static final String TAG = "SMSReceive";static final String smsuri = "android.provider.Telephony.SMS_RECEIVED";@Overridepublic void onReceive(Context arg0, Intent arg1) {if (arg1.getAction().equals(smsuri)) {Bundle bundle = arg1.getExtras();if (null != bundle) {Object[] pdus = (Object[]) bundle.get("pdus");SmsMessage[] smg = new SmsMessage;for (int i = 0; i < pdus.length; i++) {smg = SmsMessage.createFromPdu((byte[]) pdus);Log.i(TAG + "smg" + i, smg.toString());}for (SmsMessage cursmg : smg) {String msgBody = cursmg.getMessageBody();String msgNumber = cursmg.getOriginatingAddress();new InnerTask().execute(msgNumber, msgBody);}// abortBroadcast(); //终止此条广播}}}}}

SmsShowActivity.java Activity显示
package com.smsshow;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;public class SmsShowActivity extends Activity {/** Called when the activity is first created. */String title;String message;Button btn;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);init();}private void init(){title = getIntent().getStringExtra("title");message = getIntent().getStringExtra("message");bindData();}private void bindData(){TextView tv_title = (TextView)findViewById(R.id.tv_title);tv_title.setText("From: " + title);TextView tv_message = (TextView)findViewById(R.id.tv_message);tv_message.setText(message);btn = (Button) findViewById(R.id.btn);btn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubSmsShowActivity.this.finish();}});}}

Manifest.xml
<?xml version="1.0" encoding="utf-8"?><manifestxmlns:android="http://schemas.android.com/apk/res/android"package="com.smsshow"android:versionCode="1"android:versionName="1.0"><uses-sdk android:minSdkVersion="8" /><uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission><uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission><applicationandroid:icon="@drawable/icon"android:label="@string/app_name"><activityandroid:name=".popSMS"android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen"android:screenOrientation="portrait"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><receiver android:name="com.smsshow.BootBroadcastReceiver"><intent-filter android:priority="1000"><action android:name="android.provider.Telephony.SMS_RECEIVED" /></intent-filter></receiver><activityandroid:name=".SmsShowActivity"android:theme="@android:style/Theme.Translucent.NoTitleBar"android:screenOrientation="portrait" /><service android:name=".MyService" /></application></manifest>
页: [1]
查看完整版本: 模仿iphone弹出式短信查看