看着手机上的360浮动小球,不评价其具体的功能与实用性,至少在UI设计与交互方面是个不小的创新。

  

  如图片左上角所示,球中还会显示当前手机的运行状况,向下拉动还会有弹射来达到加速、清理等目的。

  那好,先来实现一个类似的小球(仅限于形状,功能你懂得)。

  查阅了相关资料,整个界面除了小球以外,其他部分均是做透明处理。

  1、由于用到了CompatModeWrapper,所以需要在AndroidManifest.xml中添加以下权限:

 <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

  要想在应用中被启动为一个Activity或Service,需要注册,这里是Service:

 <service android:name=".Service1" />

  2、界面透明化处理,整体代码如下:

 package com.XXX.autostart;

 import android.view.View;

 import android.app.Service;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.os.Handler;
import android.os.IBinder;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.WindowManager.LayoutParams;
import android.widget.ImageButton;
import android.widget.LinearLayout; public class Service1 extends Service
{
LinearLayout mFloatLayout;
WindowManager.LayoutParams wmParams;
WindowManager mWindowManager; ImageButton mFloatView; @Override
public void onCreate()
{
// TODO Auto-generated method stub
super.onCreate(); createFloatView();
} @Override
public IBinder onBind(Intent intent)
{
// TODO Auto-generated method stub
return null;
} private void createFloatView()
{
wmParams = new WindowManager.LayoutParams(); mWindowManager = (WindowManager)getApplication().getSystemService(getApplication().WINDOW_SERVICE); wmParams.type = LayoutParams.TYPE_PHONE;
wmParams.format = PixelFormat.RGBA_8888; wmParams.flags = LayoutParams.FLAG_NOT_FOCUSABLE; wmParams.gravity = Gravity.LEFT | Gravity.TOP; wmParams.x = 0;
wmParams.y = 0; wmParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
wmParams.height = WindowManager.LayoutParams.WRAP_CONTENT; LayoutInflater inflater = LayoutInflater.from(getApplication());
mFloatLayout = (LinearLayout) inflater.inflate(R.layout.float_layout, null); mWindowManager.addView(mFloatLayout, wmParams); mFloatView = (ImageButton)mFloatLayout.findViewById(R.id.float_id); mFloatLayout.measure(View.MeasureSpec.makeMeasureSpec(0,
View.MeasureSpec.UNSPECIFIED), View.MeasureSpec
.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); mFloatView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub wmParams.x = (int) event.getRawX() - mFloatView.getMeasuredWidth() / 2; wmParams.y = (int) event.getRawY() - mFloatView.getMeasuredHeight() / 2 - 25; mWindowManager.updateViewLayout(mFloatLayout, wmParams);
return false;
}
}); mFloatView.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub
mFloatView.setVisibility(View.INVISIBLE); Handler handler = new Handler();
handler.postDelayed(new Runnable() {
public void run() {
mFloatView.setVisibility(View.VISIBLE);
}
}, 3000); }
});
} @Override
public void onDestroy()
{
// TODO Auto-generated method stub
super.onDestroy();
if(mFloatLayout != null)
{
mWindowManager.removeView(mFloatLayout);
}
} }

  这里是利用ImageButton组件来实现小球,关键在于其显示的图片是圆形。

  因此,要想将浮动窗口实现为其他形状,只需制作相应的图片赋给组件。

  对于小球的功能,只是实现了在手机屏幕上随意拖动,单击消失三秒后重现。

  3、浮动小球有了,怎么让它启动呢?注意上面实现的类Service1,继承的是Service。

  在ManiActivity.java中,让其显现的方式很简单,代码如下:

 finish();
Intent intent = new Intent(getApplicationContext(), Service1.class);
startService(intent);

  注意,这里对于MainActivity类不需要做任何处理,新建工程时默认就好。当然,要实现其他功能例外。

  代码finish();可加可不加,加上之后使得程序一运行就只剩下小球,原来的界面让其消失。

  效果图如下,图形找的是红色小火焰。

  4、到此,浮动小球就实现了,那怎么让它开机自启动呢?

  其实也很简单,用到了BroadcastReceiver。

  还是先添加权限:

 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

  另外,对于系统的广播消息,要想在开机等时刻能够捕获到,还需添加以下内容:

 <receiver android:name=".BootBroadcastReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>

  实现代码如下:

 package com.XXX.autostart;

 import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent; public class BootBroadcastReceiver extends BroadcastReceiver { static final String ACTION = "android.intent.action.BOOT_COMPLETED"; @Override
public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(ACTION)) {
Intent intent1 = new Intent(context, Service1.class);
intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startService(intent1);
}
}
}

  

  将手机ReBoot,可以发现红色小球会自行启动,不过速度比较慢(和360安全卫士相比)。

Android浮动小球与开机自启动的更多相关文章

  1. 用Xamarin 实现园友的 :Android浮动小球与开机自启动

    原文:用Xamarin 实现园友的 :Android浮动小球与开机自启动 前两天看园子里有筒子写了个 Android浮动小球与开机自启动  , 感觉这种被 360 玩烂的功能原来是如此的简单啊... ...

  2. Android 开机自启动应用

    Android启动时,会发出一个系统广播 ACTION_BOOT_COMPLETED,它的字符串常量表示为 “android.intent.action.BOOT_COMPLETED” 开机自启动程序 ...

  3. Android应用开机自启动问题

    本文主要介绍Android应用如何实现开机自启动.自启动失败的原因以及通过ADB命令模拟发送BOOT_COMPLETED开机广播. 1.Android应用如何实现开机自启动 (1) 实现一个广播类,接 ...

  4. android 程序开机自启动

    今天遇到程序开机自启动,然后查了一下,很简单,就记录一下. 开机自启动,一般我们是开启启动一个广播,然后在广播里启动Activity或者别的服务. 我们要做的很简单,就是在AndroidManifes ...

  5. Android开机自启动程序

    背景知识:当Android启动时,会发出一个系统广播,内容为ACTION_BOOT_COMPLETED,它的字符串常量表示为 android.intent.action.BOOT_COMPLETED. ...

  6. Android 开机自启动

    首先实现开机自启动: 第一步创建一个广播接收者,如MyBootBroadcastReceiver.java package com.example; import android.content.Br ...

  7. Android应用如何开机自启动、自启动失败原因

    本文主要介绍Android应用如何开机自启动.自启动失败的原因.adb命令发送BOOT_COMPLETED.问题:应用程序是否可以在安装后自启动,没有ui的纯service应用如何启动?答案马上揭晓^ ...

  8. android 开机自启动实现

    App的开机自启动可以通过注册广播接收器接收开机广播来实现,具体步骤如下: 1.创建 BroadcastReceiver 的派生类,并重写 onReceive() 函数: /** * Created ...

  9. Android——开机自启动app

    android在开机完成后会发送一个android.intent.action.BOOT_COMPLETED的广播,告诉系统内app们已经开机. 我们可以在需要开机自启动的app中定义一个广播接收器, ...

随机推荐

  1. SQL查询数据库中所有指定类型的字段名称和所在的表名

    --查询数据库中所有指定类型的字段名称和所在的表名 --eg: 下面查的是当前数据库中 所有字段类型为 nvarchar(max) 的字段名和表名 SELECT cols.object_id , co ...

  2. OpenResty(nginx+lua) 入门

    OpenResty 官网:http://openresty.org/ OpenResty 是一个nginx和它的各种三方模块的一个打包而成的软件平台.最重要的一点是它将lua/luajit打包了进来, ...

  3. Linux服务器文件删除空间未释放的问题

    一.问题起源 在Linux系统中,通过rm删除文件将会从文件系统的目录结构上解除链接(unlink),如果文件是被打开的(有一个进程正在使用),那么进程将仍然可以读取该文件磁盘空间也一直被占用 这样就 ...

  4. cocos2d-x 3.10 屏幕适配问题

    cocos2d-x 的屏幕适配问题困扰了我很久,差不多有一个星期吧.通过亲身实践才解决了问题,分享一下解决办法,供大家借鉴学习. 其实解决办法很简单,把下面代码注释掉就好了 // if (frameS ...

  5. Linux IPC System V 信号量

    模型 #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> ftok() //获取key ...

  6. LeetCode#227.Basic Calculator II

    题目 Implement a basic calculator to evaluate a simple expression string. The expression string contai ...

  7. x01.Game.LitSkull: 梯次防御

    1.人要有点精神 人要有点精神,否则,不是沦落为毫无意义的看客,就是退化成食色性也的动物,有被开除球籍的危险,如晚清. 2.框架 引号头文件在当前目录下搜寻,三角头文件在配置目录下搜寻,这是一个简单的 ...

  8. 从vmware下载到Linux环境下jdk和maven的安装

    写在前面:个人总结,如有不对请指出 操作环境: 操作系统:window7 企业版 处理器:Intel Core i5-4200U CPU @ 1.6GHz 内存:8G 系统类型:64位操作系统 需要安 ...

  9. 理解 Linux 网络栈(2):非虚拟化Linux 环境中的 Segmentation Offloading 技术

    本系列文章总结 Linux 网络栈,包括: (1)Linux 网络协议栈总结 (2)非虚拟化Linux环境中的网络分段卸载技术 GSO/TSO/UFO/LRO/GRO (3)QEMU/KVM + Vx ...

  10. Solr初始化源码分析-Solr初始化与启动

    用solr做项目已经有一年有余,但都是使用层面,只是利用solr现有机制,修改参数,然后监控调优,从没有对solr进行源码级别的研究.但是,最近手头的一个项目,让我感觉必须把solrn内部原理和扩展机 ...