如前面所说,我在方案公司工作,日常负责锁屏的开发。由于设计过很多锁屏,为了能够像小米手机中的主题切换中,实现百变锁屏功能。
再次我简单说下锁屏管理的思路,由于涉及到公司代码机密问题。有的地方我只会简单点到为止,估计细节如果读者有一定的功力的话,也能猜的出来时怎么实现的。
下面贴现锁屏管理的效果图片。
在锁屏管理中,出现了锁屏预览界面和锁屏的名称,这个类似于Launcher中的图标。我们就可以利用这样的思路来实现相同的功能。
首先在锁屏管理中,要能查询这个手机上面一共安装了多少个锁屏apk。类似于Launcher一样,需要查询出多少应用有图标。
Launcher中识别的条件如下所示。
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".TestlightActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
主要的标签是<category android:name="android.intent.category.LAUNCHER" />
那么我们的锁屏界面如何能查询呢?一般的Apk锁屏,都是在屏幕熄灭的时候,监听广播,然后把系统锁屏给禁止掉,最后显示我们的锁屏Activity,这样就完成了一个最简单锁屏了。
利用上面锁屏的思路,我们可以查询所有锁屏Apk。然后再接受到系统广播后,就选择性的指定某一个apk作为显示的锁屏。
void queryAllLockScreen() {
Context context = this;
PackageManager pm = context.getPackageManager();
Intent it = new Intent("com.locktest.LOCK_SCREEN");
it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
List<ResolveInfo> all = pm.queryIntentActivities(lockIntent, 0);
for (ResolveInfo info : all) {
System.out.println(info.activityInfo.packageName);
System.out.println(info.activityInfo.name);
}
}
/**
* 开启activity
*/
private void initIntent() {
lockIntent = new Intent("com.fx.locktest.LOCK_SCREEN");
String packageName = null; // 数据库中得到,没有具体实现
String className = null; // 数据库中得到,没有具体实现
lockIntent.setClassName(packageName, className);
lockIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
/**
* 屏幕变亮的广播
*/
private BroadcastReceiver screenReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF) || intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
startActivity(lockIntent);
}
}
};
最后涉及到锁屏指定以及锁屏数据保存问题。根据上面代码可以看出,所有的锁屏最主要的需要保存的数据有package以及activity的路径。这样我们就实现代码了。
由于保存的数据比较少,且是键值对的形式,个人在实现的时候,刚刚开始使用的是cottentprovider,但是这样保存比较麻烦,同时获取数据也是比较麻烦的,最后就使用了Android内置的sharepreference来保存,简单而且使用。
好了,就简单介绍到这边,由于机密问题(当然这个也不是什么大秘密),说的比较简单。
如有疑问,欢迎前来讨教。
1.addChildViewController 在 base controller中添加子的controller,会自动调用子的controller中viewDidload,viewWillAppear等视图方法,可以完成一个controller叠加各种视图
2.base 的controller必须是UIViewController,如果是 UINavigationController,则没法控制子controller frame的大小
示例代码:
BaseNavController * nav = [[BaseNavController alloc] initWithRootViewController:agendaController];
nav.view.autoresizingMask = UIViewAutoresizingNone;
[nav.view addGestureRecognizer:[[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(dragView:)]];
[self addChildViewController:nav];
nav.view.frame = CGRectMake(270, -20, DeviceWidth - 270, DeviceHeight - 200);//homeViewLeftMenuViewWidth
nav.view.backgroundColor = [UIColor yellowColor];
[self.view addSubview:nav.view];
该Demo的意思就是通过该程序去调起手机上已安装了的百度地图android客户端来进行导航,其实,个人觉得该功能实际意义不大,因为如果手机上已安装了百度地图客户端,我们可以直接就使用它进行导航,该程序只是负责去调起百度地图客户端的导航功能,而本程序并不任何导航功能,不过了解一下怎么调用也好,代码如下:
Activity:
package com.home;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import com.baidu.mapapi.navi.BaiduMapAppNotSupportNaviException;
import com.baidu.mapapi.navi.BaiduMapNavigation;
import com.baidu.mapapi.navi.NaviPara;
import com.baidu.platform.comapi.basestruct.GeoPoint;
public class NaviActivity extends Activity {
// 天安门坐标
double mLat1 = 39.915291;
double mLon1 = 116.403857;
// 百度大厦坐标
double mLat2 = 40.056858;
double mLon2 = 116.308194;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_navi_demo);
TextView text = (TextView) findViewById(R.id.navi_info);
text.setText(String.format("起点:(%f,%f)\n终点:(%f,%f)", mLat1, mLon1,
mLat2, mLon2));
}
/**
* 开始导航
*
* @param view
*/
public void startNavi(View view) {
int lat = (int) (mLat1 * 1E6);
int lon = (int) (mLon1 * 1E6);
GeoPoint pt1 = new GeoPoint(lat, lon);
lat = (int) (mLat2 * 1E6);
lon = (int) (mLon2 * 1E6);
GeoPoint pt2 = new GeoPoint(lat, lon);
// 构建 导航参数
NaviPara para = new NaviPara();
para.startPoint = pt1;
para.startName = "从这里开始";
para.endPoint = pt2;
para.endName = "到这里结束";
try {
BaiduMapNavigation.openBaiduMapNavi(para, this);
} catch (BaiduMapAppNotSupportNaviException e) {
e.printStackTrace();
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("您尚未安装百度地图app或app版本过低,点击确认安装?");
builder.setTitle("提示");
builder.setPositiveButton("确认", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
BaiduMapNavigation.GetLatestBaiduMapApp(NaviActivity.this);
}
});
builder.setNegativeButton("取消", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.create().show();
}
}
}
布局XML:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white"
tools:context=".NaviDemo" >
<TextView
android:id="@+id/navi_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:textColor="@android:color/black"
android:textSize="16sp" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/navi_info"
android:layout_centerHorizontal="true"
android:layout_marginTop="76dp"
android:onClick="startNavi"
android:text="开始导航" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/navi_info"
android:layout_alignParentLeft="true"
android:layout_marginBottom="57dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:text="@string/navi_tip"
android:textColor="@android:color/black"
android:textSize="16sp" />
</RelativeLayout>
String:navi_tip
<string name="navi_tip">本功能为调起百度地图Android客户端(V5.0及以上版本)的导航功能,用户必须已安装百度地图客户端,如果没有安装则提示用户下载安装百度地图客户端。</string>
附上图片效果: