Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / Android浮动小球与开机自启动

看着手机上的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相关信息见Android 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=11本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-07/120525.htm