开发Android小应用——短信控制的浮动窗

一、学到的知识:

 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中加入悬浮窗

    Android的短信接收处理----Broadcast和Receiver的使用

    Activity与Service通信

    Android中TASK和PROCESS的区别,获取最近运行的程序和正在运行的进程




原文地址:https://www.cnblogs.com/arcticant/p/2909084.html