`
lautherf
  • 浏览: 14969 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

android 2.2 apidemos 赏析笔记 3

 
阅读更多
AlarmController.java
SEE:
1.
            Intent intent = new Intent(AlarmController.this, OneShotAlarm.class);
            PendingIntent sender = PendingIntent.getBroadcast(AlarmController.this,
                    0, intent, 0);

            // We want the alarm to go off 30 seconds from now.
            Calendar calendar = Calendar.getInstance();
            calendar.setTimeInMillis(System.currentTimeMillis());
            calendar.add(Calendar.SECOND, 30);

            // Schedule the alarm!
            AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
            am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);
SO:
PendingIntent 待响应的意图。有三个主要方法getActivity(Context, int, Intent, int), getBroadcast(Context, int, Intent, int), getService(Context, int, Intent, int); 表示可以开启三种类型的东东,设置时间与设置AlarmManager的方法如上。。。
PS:android:process=":remote",代表在应用程序里,当需要该service时,会自动创建新的进程。而如果是android:process="remote",没有“:”分号的,则创建全局进程,不同的应用程序共享该进程。

SEE:
1.
            Intent intent = new Intent(AlarmController.this, RepeatingAlarm.class);
            PendingIntent sender = PendingIntent.getBroadcast(AlarmController.this,
                    0, intent, 0);
           
            // We want the alarm to go off 30 seconds from now.
            long firstTime = SystemClock.elapsedRealtime();
            firstTime += 15*1000;

            // Schedule the alarm!
            AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
            am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                            firstTime, 15*1000, sender);
SO:
setRepeating来设置重复,注意到与上面的计时方式不一样.见PS:

PS:
android.os.SystemClock
Class Overview
    System.currentTimeMillis()

    该时间是基于世界时间的,它返回的是从January 1, 1970 00:00:00 UTC到现在时间已经逝去了多多少millisecond,当我设置Android手机的系统时间时,会应该影响该值。

    uptimeMillis()

    它表示的是手机从启动到现在的运行时间,且不包括系统sleep(CPU关闭)的时间,很多系统的内部时间都是基于此,比如Thread.sleep(millls), Object.wait(millis), and System.nanoTime()

    elapsedRealtime()

    它表示的是手机从启动到现在的运行时间,且包括系统sleep(CPU关闭)的时间

SEE:
1.
            AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
            am.cancel(sender);
SO:
取消重复的操作

AlarmService.java
SEE:
1.
        mNM = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);

        // show the icon in the status bar
        showNotification();
2.
private void showNotification() {
        // In this sample, we'll use the same text for the ticker and the expanded notification
        CharSequence text = getText(R.string.alarm_service_started);

        // Set the icon, scrolling text and timestamp
        Notification notification = new Notification(R.drawable.stat_sample, text,
                System.currentTimeMillis());

        // The PendingIntent to launch our activity if the user selects this notification
        PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
                new Intent(this, AlarmService.class), 0);

        // Set the info for the views that show in the notification panel.
        notification.setLatestEventInfo(this, getText(R.string.alarm_service_label),
                       text, contentIntent);

        // Send the notification.
        // We use a layout id because it is a unique number.  We use it later to cancel.
        mNM.notify(R.string.alarm_service_started, notification);
    }
3.
    public void onDestroy() {
        // Cancel the notification -- we use the same ID that we had used to start it
        mNM.cancel(R.string.alarm_service_started);
SO:
Notification(R.drawable.stat_sample, text,System.currentTimeMillis());分别是,标题栏闪过的图片,内容,时间。PendingIntent.getActivity(this, 0,new Intent(this, AlarmService.class), 0);点击通知时的意图;notification.setLatestEventInfo(this, getText(R.string.alarm_service_label),text, contentIntent);下拉通知栏,通知的内容标签,内容,意图。mNM.notify(R.string.alarm_service_started, notification);正式的发送通知,第一个参数是ID,居然用这个字符串资源的值来做ID。懒到极点 我喜欢~

SEE:
1.
        Thread thr = new Thread(null, mTask, "AlarmService_Service");
        thr.start();
2.
public void run() {
            // Normally we would do some work here...  for our sample, we will
            // just sleep for 30 seconds.
            long endTime = System.currentTimeMillis() + 15*1000;
            while (System.currentTimeMillis() < endTime) {
                synchronized (mBinder) {
                    try {
                        mBinder.wait(endTime - System.currentTimeMillis());
                    } catch (Exception e) {
                    }
                }
            }

            // Done with our work...  stop the service!
            AlarmService_Service.this.stopSelf();
        }
SO:
AlarmService_Service.this.stopSelf();这个也会调用onDestory()...也就是按下start Alarm Service的时候 显示一个通知,该通知15秒后自动停止,30秒后再显示该通知。。。 蛋疼。

DeviceAdminSample.java
SEE:
1.AndroidManifest.xml
        <!-- Device Admin Samples -->

        <activity android:name=".app.DeviceAdminSample$Controller"
                android:label="@string/activity_sample_device_admin">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.SAMPLE_CODE" />
            </intent-filter>
        </activity>


        <receiver android:name=".app.DeviceAdminSample"
                android:label="@string/sample_device_admin"
                android:description="@string/sample_device_admin_description"
                android:permission="android.permission.BIND_DEVICE_ADMIN">
            <meta-data android:name="android.app.device_admin"
                       android:resource="@xml/device_admin_sample" />
            <intent-filter>
                <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
            </intent-filter>
        </receiver>
SO:
这里的DeviceAdminSample是一个receiver,不是妹子不是Activity。controller才是。所以有android:name=".app.DeviceAdminSample$Controller",protected void onCreate()纠结了 静态类不能实例化,难道activity都不实例化的?这个就分析不来 MARK 有知道的告诉声 暂且当成正常的activity...

SEE:
1.
ComponentName mDeviceAdminSample;
2.
            mDeviceAdminSample = new ComponentName(Controller.this, DeviceAdminSample.class);
3.
                Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
                intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,
                        mDeviceAdminSample);
                intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,
                        "Additional text explaining why this needs to be added.");
                startActivityForResult(intent, RESULT_ENABLE);
4.
                mDPM.removeActiveAdmin(mDeviceAdminSample);
SO:
程序动态加载权限。神器呀intent真是变换莫测。DevicePolicyManager.EXTRA_DEVICE_ADMIN="android.app.extra.DEVICE_ADMIN"
DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN="android.app.action.ADD_DEVICE_ADMIN" ,EXTRA_ADD_EXPLANATION ="android.app.extra.ADD_EXPLANATION"

SEE:
1.
            mPasswordQuality = (Spinner)findViewById(R.id.password_quality);
            ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
                    this, R.array.password_qualities, android.R.layout.simple_spinner_item);
            adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            mPasswordQuality.setAdapter(adapter);
            mPasswordQuality.setOnItemSelectedListener(
                    new OnItemSelectedListener() {
                        public void onItemSelected(
                                AdapterView<?> parent, View view, int position, long id) {
                            setPasswordQuality(mPasswordQualityValues[position]);
                        }

                        public void onNothingSelected(AdapterView<?> parent) {
                            setPasswordQuality(DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED);
                        }
                    });
SO:
动态设置Spinner下拉菜单的选项范例。。


SEE:
1.mSetPasswordListener
                Intent intent = new Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD);
                startActivity(intent);
2.
SO:设置密码界面

SEE:
            mPasswordLength = (EditText)findViewById(R.id.password_length);
            mPasswordLength.addTextChangedListener(new TextWatcher() {
                public void afterTextChanged(Editable s) {
                }
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                }
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                    try {
                        setPasswordLength(Integer.parseInt(s.toString()));
                    } catch (NumberFormatException e) {
                    }
                }
            });
SO:
textView的监听范例

SEE:
            boolean active = mDPM.isAdminActive(mDeviceAdminSample);
            if (active) {
                mDPM.setPasswordQuality(mDeviceAdminSample, pwQuality);
                mDPM.setPasswordMinimumLength(mDeviceAdminSample, pwLength);
                mDPM.setMaximumFailedPasswordsForWipe(mDeviceAdminSample, maxFailedPw);
            }
SO:
mDPM.isAdminActive(mDeviceAdminSample)//当前设备管理器是否激活,DevicePolicyManager的相关设置


SEE:
                Intent intent = new Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD);
                startActivity(intent);
SO:
打开密码设置界面


SEE:
                if (mAM.isUserAMonkey()) {
                    // Don't trust monkeys to do the right thing!
                    AlertDialog.Builder builder = new AlertDialog.Builder(Controller.this);
                    builder.setMessage("You can't reset my password because you are a monkey!");
                    builder.setPositiveButton("I admit defeat", null);
                    builder.show();
                    return;
                }
                boolean active = mDPM.isAdminActive(mDeviceAdminSample);
                if (active) {
                    mDPM.resetPassword(mPassword.getText().toString(),
                            DevicePolicyManager.RESET_PASSWORD_REQUIRE_ENTRY);
                }
SO:
1.mAM.isUserAMonkey(),防止用户胡乱操作修改密码成功。。神奇的函数
(传送门)
2.AlertDialog.Builder范例
3.
mDPM.resetPassword(mPassword.getText().toString(),                         DevicePolicyManager.RESET_PASSWORD_REQUIRE_ENTRY);这就设置密码成功了。。。很危险呀,这不是想改就改了,权限不能乱给的。。手机开不开了就爽了

SEE:
                    mDPM.lockNow();
SO:黑屏?不,锁屏了。。。叫你随意给权限

SEE:
mDPM.wipeData(0);
SO:
清除用户数据。。数据。。。回复出厂设置吗?

这个速度权限取消了吧
==============================完

AlertDialogSamples


SEE:
1.
    @Override
    protected Dialog onCreateDialog(int id) {
2.
showDialog(DIALOG_YES_NO_MESSAGE);
SO:
重写方法来创建对话框 而不是直接创建对话框。。新方法

以后创建Dialog可以来这里拉代码 就不多写了

==============================完

Intents.java

SEE:
1.
            Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
            intent.setType("audio/*");
            startActivity(Intent.createChooser(intent, "Select music"));
SO:
用来打开音乐文件的方法,如果用音乐来打开的话会出错,没有指名音乐路径。Intent.createChooser(intent, "Select music")指定相应的对话框名字。
















分享到:
评论

相关推荐

    Android2.2 ApiDemos

    《Android 2.2 ApiDemos深度解析》 在Android开发领域,ApiDemos是一个非常重要的参考资料,它是由Google官方提供的一个示例程序,包含了Android SDK中的各种API功能的演示。这个项目,针对的是Android 2.2(API...

    Android6.0 Api Demos

    **Android 6.0 API Demos详解** Android 6.0 API Demos 是一个官方提供的示例代码集合,它展示了Android 6.0 (Marshmallow) SDK中的各种API功能和用法。这些示例旨在帮助开发者更好地理解和学习如何在实际应用中...

    android的ApiDemos

    API Demos 是 Google 为了 Android 开发者所提供的一个 Android API 合集,其中包含了很多的 API 范例,同时遵循了良好的代码规范,是一个值得开发者研究和学习的典型。android的ApiDemos,需要解压缩后使用。

    最新Android apidemos

    《深入探索Android API Demos:最新实践与技术解析》 Android API Demos是Google官方提供的一款用于展示Android SDK中各种API功能和用法的应用程序,它涵盖了从基础控件到高级特性的全方位示例,是开发者学习...

    android1.6 apiDemos

    《Android 1.6 API Demos深度解析》 在Android开发的世界中,API Demos是一个不可或缺的学习资源,它为开发者提供了丰富的示例代码,帮助理解并掌握Android API的各种功能。本篇文章将深入探讨"android1.6 apiDemos...

    Android6.0 ApiDemos.apk

    从官方预览包里提取的Android6.0 ApiDemos.apk,方便安装在真机上查看实例的实际效果。

    Android ApiDemos apk

    《Android ApiDemos apk:深入理解Android应用开发的实践指南》 Android ApiDemos apk是Android开发者们熟悉的一个示例程序,它包含了Android SDK中的各种API功能演示,为开发者提供了丰富的学习资源。这个应用程序...

    android4.3 Apidemos

    《Android 4.3 ApiDemos深度解析》 在Android操作系统的发展历程中,每个版本的更新都会带来新的特性和API,以提升用户体验和开发者的工作效率。Android 4.3(API级别18)是Android系统的一个重要里程碑,它引入了...

    Android4.1ApiDemos最新

    《深入解析Android 4.1 ApiDemos》 在Android开发领域,ApiDemos是一个非常重要的参考资料,它是由Google官方提供的示例代码集合,用于演示Android SDK中的各种API功能。对于开发者来说,尤其是对Android 4.1...

    Android ApiDemos4.4 示例解析

    最新版ApiDemos Android SDK 中带有很多例子,其中ApiDemo 详细介绍了Android 平台主要API,分成了 · App · Content · Graphics · Media · OS · Text · Views 几个大类,每个大类又分为几个小类,...

    Android 5.1 ApiDemos.apk

    Android 5.1的ApiDemos安装包

    android 3.0 ApiDemos

    《Android 3.0 ApiDemos详解》 在Android开发领域,`ApiDemos`是一个非常重要的学习资源,它是Google官方提供的一款示例程序,包含了Android SDK中的各种API功能演示。这个项目主要用于帮助开发者理解并熟悉Android...

    android_ApiDemos

    《Android ApiDemos详解——深度探索Android开发应用实例》 Android ApiDemos是Android开发者学习和理解Android API的重要资源,它包含了丰富的示例代码,涵盖了Android SDK中的各种API功能。这个程序是专为Android...

    Android ApiDemos

    **Android ApiDemos详解** `Android ApiDemos` 是Android系统提供的一款官方示例程序,它集合了Android SDK中的各种API用法,是开发者学习和理解Android开发的关键资源。这个项目旨在通过实例代码来演示Android API...

    Android官网ApiDemos源码

    Android官网ApiDemos源码 供大家学习参考之用

    android ApiDemos

    《Android API Demos详解》 Android API Demos是一款由谷歌官方提供的开源项目,它包含了大量Android SDK中的API示例代码,旨在帮助开发者更好地理解和学习如何在实际应用中使用Android的各种功能和API。该项目覆盖...

    Android ApiDemos不报错版本,eclipse可用

    **Android ApiDemos详解** ApiDemos是Android官方提供的一款示例应用,它包含了Android SDK中的各种API功能演示,帮助开发者了解和学习Android系统提供的各种API接口和功能。这个"Android ApiDemos不报错版本"是...

    android ApiDemos不报错版本

    《Android ApiDemos不报错版本:探索与学习》 Android ApiDemos是Android平台上的一个官方示例项目,它为开发者提供了丰富的API演示,涵盖了Android系统中的各种控件和功能,是学习和理解Android开发的宝贵资源。这...

    android api19 ApiDemos

    《Android API 19 ApiDemos详解》 在Android开发领域,API Demos是一个非常重要的学习资源,它包含了Android SDK中的各种API示例代码,帮助开发者深入理解和掌握Android平台的功能特性。本文将针对API Level 19...

Global site tag (gtag.js) - Google Analytics