类似360 的那个小球,一直悬浮在手机桌面上,点击时跳转其他界面
先说一下这个APK,为什么要说呢,因为安装完看不见图标,然后你会发现什么都没有,先去应用设置里,这个需要显示悬浮框的权限,而且我还设置了开机自启,这个也需要用户开启,默认都是不开起的(反正小米的是这样)
要实现这些,首先需要添加权限,AndroidManifest.xml里
<!--service 需要-->
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
<!-- 开机自启 -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<!--扫描本地文件-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
我这里加入了上一个读取本地文件功能
应用不显示图标,形如
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@android:style/Theme.Translucent.NoTitleBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<data android:host="AuthActivity" android:scheme="android.cl.com.suspensionball.floder" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
在activity 里添加date 属性,后面的包名随便写一个,我们只是要不显示图标
然后是开机自启:监听 RECEIVE_BOOT_COMPLETED 广播嘛,AndroidManifest.xml里
<receiver android:name="BootBroadcastReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"></action>
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.HOME" />
</intent-filter>
</receiver>
由于现在android手机系统的缘故,安装在SD卡里的很多应用接收不到广播信息,所以需要修改安装位置,
AndroidManifest.xml里<manifest>里添加android:installLocation="internalOnly"
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:installLocation="internalOnly"
package="android.cl.com.suspensionball" >
然后写一个广播接收者
import android.cl.com.suspensionball.service.TopFloatService;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
/**
* Created by Administrator on 2016/1/21.
*/
public class BootBroadcastReceiver extends BroadcastReceiver {
//重写onReceive方法
@Override
public void onReceive(Context context, Intent intent) {
//后边的XXX.class就是要启动的服务
//开机 BOOT_COMPLETED
Intent service = new Intent(context,TopFloatService.class);
context.startService(service);
Log.v("TAG", "开机自动服务自动启动.....");
}
}
转到要启动的服务就好了
我的service 用的烂的一塌糊涂,主体部分基本上是参考前辈的 http://www.ddvip.com/tech/1000184211_pall.html
看看service
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningTaskInfo;
import android.app.Service;
import android.cl.com.suspensionball.MyWindowManager;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.Handler;
import android.os.IBinder;
public class TopFloatService extends Service {
/**
* 用于在线程中创建或移除悬浮窗。
*/
priva