如前面所说,我在方案公司工作,日常负责锁屏的开发。由于设计过很多锁屏,为了能够像小米手机中的主题切换中,实现百变锁屏功能。
再次我简单说下锁屏管理的思路,由于涉及到公司代码机密问题。有的地方我只会简单点到为止,估计细节如果读者有一定的功力的话,也能猜的出来时怎么实现的。
下面贴现锁屏管理的效果图片。
在锁屏管理中,出现了锁屏预览界面和锁屏的名称,这个类似于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>
附上图片效果: