一、学到的知识:
1.服务的启动和停止;
a.Context.startService()
启动流程:startService() -> onCreate() -> onStart()
停止流程:stopService(0 -> onDestory()
如果调用者直接退出而没有stopService,则Service会一直在后台运行;
b.Context.bindService()
启动流程:bindService() -> onCreate() -> onBind()
调用者退出后,Service就会unbindService() -> onUnbind() -> onDestory()
2.通过将view加入到WindowManager让view一直在屏幕上显示;
首先要在AndroidManifest.xml中加入权限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
a.先定义一个View
View view = LayoutInflater.from(this).inflate(R.layout.floating, null);
b.获取WindowManager
WindowManager wm; wm = (WindowManager) this.getSystemService(WINDOW_SERVICE);
c.设置参数
WindowManager.LayoutParams wmParams; wmParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, LayoutParams.TYPE_SYSTEM_ERROR, LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSPARENT); wmParams.gravity = Gravity.LEFT | Gravity.TOP;
d.将View加入到WindowManager中。
wm.addView(view, wmParams);
e.如果要去掉,只需要从WindowManager中remove。
wm.removeView(view);
3.通过bindService方法来启动service,使用ServiceConnection实现于Service的通信;
4.通过BroadcastReceiver监听短消息;
a.在AndroidManifest.xml中加入权限;
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
b.事件的动态注册与取消;
registerReceiver(BroadcastReceiver receiver, IntentFilter filter);
unregisterReceiver(BroadcastReceiver receiver);
5.利用ActivityManager获取应用程序信息;
ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); List<RecentTaskInfo> recentTask = am.getRecentTasks(64, 0); PackageManager pm = getPackageManager(); Intent intent = recentTask.get(0).baseIntent; ResolveInfo resolveInfo = pm.resolveActivity(intent, 0); String appName = resolveInfo.loadLabel(pm).toString();
二、程序主要文件及其功能
FloatingSmileActivity类:控制服务的开关
主要功能: 两个按钮,控制FloatingObj service的开关。
Floating service类文件:主要服务的文件
主要功能:
1.启动后有图片自由移动;
2.根据从指定号码收到的短信息来控制当前的状态。
a.收到包含“dismiss”消息后,点击图片,图片消失(默认的状态)。
只有进入应用再次点击“开”才能再次出现。
b.收到包含“burst”消息后,点击图片,产生burst效果。
c.收到包含“smile”消息后,点击图片,产生smile效果。
d.收到包含”learning“消息后,点击图片,会清除以前的关联信息,重新关联到最近启动的程序,下次点击图片就会直接启动这个程序。
e.收到包含“learned”消息后,点击图片,会启动上次关联到的程序,如果没有关联,则先关联到要一个。
3.控制Effect服务。根据当前的状态发送相应消息到Effect服务,使之产生相应效果。
Effect service类:产生效果的服务;
当前有两个功能:
1.收到burst消息后,产生burst效果,默认3秒后自动清除;
2.收到smile消息后,产生smile效果,默认5秒后自动清除;
遇到的问题:
1.本来打算用AnimationDrawable类来实现动画效果,但是得到的还是静态图,没有动画效果。
三、 ubuntu中模拟器下发送短信方法:
1.启动模拟器,查看端口号,标题栏显示,一般都是5554;
2.终端下连接模拟器:telnet localhost 5554
3.模拟发送短信,如 sms send 123 smile
其中,123为模拟发送的手机号
工程代码已上传至:http://download.csdn.net/detail/arcticant/4773369
参考资料:
Android的短信接收处理----Broadcast和Receiver的使用
Android中TASK和PROCESS的区别,获取最近运行的程序和正在运行的进程