Android应用程序开发与典型案例监听系统开关机
- 格式:ppt
- 大小:1005.50 KB
- 文档页数:3
广播接收者之开机启动的监听在Android开发中,我们常常需要监听系统的开机启动广播。
例如Android系统的桌面程序,当系统启动时,则运行桌面程序,并列举Android设备上的所有应用到桌面上。
下面我们将通过一个Demo来监听系统的启动广播事件。
设计需求:开发一个勒索应用,一旦用户开机,该勒索应用就自动运行,无论用户点击“BACK”按键还是“HOME”按键都不能退出该应用。
具体步骤如下:1.编写广播接收者新建工程“04_勒索软件”,在该工程的包下新建一个类“BootReceiver”,此时工程结构如图1-1所示:图1-1所示编写“BootReceiver”使之继承BroadcastReceiver并重写onReceive方法。
具体代码如例1-1:例1-1编写了一个广播接收者即SDStatusReceiver,一旦接收到对应的广播就执行onReceive方法。
广播接收者已经编写完成,我们还需要注册该广播接收者。
2.声明该广播接收者在项目清单文件中注册该广播接收者SDStatusReceiver,代码如下例1-2:例1-23.指定接收的意图在“04_勒索软件”应用中,我们只对开机的广播感兴趣,对于其他的系统广播并不感兴趣。
为此,我们需要指定该广播接收者所要接收的系统广播。
代码如例1-3:从例1-3可知:我们可以通过意图过滤器来指定广播接收器需要接收的系统广播,常量“android.intent.action.BOOT_COMPLETED”就表示系统开启事件。
至此,我们已经完成了广播接收器编写,接下来就是处理“04_勒索软件”的勒索界面,根据需求设计页面效果如图1-2所示:图1-2所示从图1-2可知:当系统开启之后,“04_勒索软件”就会自动运行并一直显示图1-2所示页面。
此时,“BACK”按键和“HOME“按键都会陪屏蔽掉,从而到达勒索的目的。
在例1-1中我们虽然重写了onReceive方法,但没有编写该方面的业务逻辑,调整例1-1代码如例1-4所示:从例1-4可知:一旦该广播接收器调用了onReceive方法,系统就会跳转到MainActivity页面中也就是勒索页面。
androidstudio按钮监听的5种⽅法实例详解1.匿名内部类public class MainActivity extends AppCompatActivity implements View.OnClickListener {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);Button btn1 = findViewById(R.id.btn1);//匿名内部类btn1.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(getApplicationContext(), “你点击了按钮1”, Toast.LENGTH_LONG).show();}});}2.内部类public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);Button btn2 = findViewById(R.id.btn2);Btn2CLickListener btn2CLickListener = new Btn2CLickListener();btn2.setOnClickListener(btn2CLickListener);}class Btn2CLickListener implements View.OnClickListener{@Overridepublic void onClick(View v){Toast.makeText(getApplicationContext(),“你点击了按钮2”,Toast.LENGTH_LONG).show();}}3外部类**MainActivity.java:public class MainActivity extends AppCompatActivity{protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);}Button btn3 = findViewById(R.id.btn3);Btn3ClickListener btn3CLickListener = new Btn3ClickListener(getApplicationContext());btn3.setOnClickListener(btn3CLickListener);}Btn3ClickListener.java:4⾃⾝activitypublic class MainActivity extends AppCompatActivity implements View.OnClickListener {protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);Button btn4 = findViewById(R.id.btn4);//main activitybtn4.setOnClickListener(this);}public void onClick(View v) {Toast.makeText(getApplicationContext(), “你点击了按钮4”, Toast.LENGTH_SHORT).show();}}5直接绑定到标签activity_main.xml:添加 android:onClick=“myClick”。
Android截取开机关机事件Android截取开机关机事件2011-06-29 10:16:04标签:Android 移动开发Boot Shutdown监听Android开机关机事件!首先创建一个Android工程,整个工程的目录结构如下:主activity代码不做更改:HelloWorldActivity.classpackage com.android.ray.activity;import android.app.Activity;import android.os.Bundle;public class HelloWorldActivity extends Activity {public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(yout.main);}}然后新建两个BroadCastReceiver代码如下:BootReceiver.classpackage com.android.ray.service;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.util.Log;public class BootReceiver extends BroadcastReceiver {private String ACTION_BOOT = "android.intent.action.BOOT_COMPLETED";public void onReceive(Context context, Intent intent) {if(intent.getAction().equals(ACTION_BOOT)){System.out.println("----------******----------");System.out.println("Boot this system!!!");Log.i("MainActivity", "Boot this system!!!");}}}ShutdownReceiver???package com.android.ray.service;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.util.Log;public class ShutdownReceiver extends BroadcastReceiver {private String ACTION_SHUTDOWN = "android.intent.action.ACTION_SHUTDOWN";public void onReceive(Context context, Intent intent) {if(intent.getAction().equals(ACTION_SHUTDOWN)){System.out.println("----------******----------");System.out.println("Shut down this system!!!");Log.i("MainActivity", "Shut down this system!!!");}}最后在Manifest.xml中申明这两个BroadCastReceiver并添上权限<?xml version="1.0" encoding="utf-8"?><manifestxmlns:android="/apk/res/android" package="com.android.ray.activity"android:versionCode="1"android:versionName="1.0"><uses-sdk android:minSdkVersion="10" /><uses-permissionandroid:name="android.permission.RECEIVE_BOOT_COMPLETED" /><application android:icon="@drawable/icon" android:label="@string/app_name"><activity android:name=".HelloWorldActivity"android:label="@string/app_name"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="UNCHER" /></intent-filter></activity><receiverandroid:name="com.android.ray.service.BootReceiver"><intent-filter><actionandroid:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter></receiver><receiverandroid:name="com.android.ray.service.ShutdownReceiver"> <intent-filter><actionandroid:name="android.intent.action.ACTION_SHUTDOWN"/> </intent-filter></receiver></application></manifest>注意:重启模拟器才会执行BootReceiver.class。
Android开关机动画/铃音是如何播放的?1. 开关机动画的启动Android系统在init.rc中定义了很多Servic,具体定义格式可以参考《Android Platform Developer’s Guide》中的“Android Init Language”。
Init.rc中定义的Service将会被Init进程创建,其中已经定义的服务就包含了开机动画.每一项服务必须在/init.rc中定义.Android系统启动时,init守护进程将解析init.rc和启动属性服务,属性“ ctl.st art ”和“ ctl.stop ”是用来启动和停止服务的。
一旦收到设置“ ctrl.start ”属性的请求,属性服务将使用该属性值作为服务名找到该服务,启动该服务。
这项服务的启动结果将会放入“ init.svc.<服务名>“属性中。
客户端应用程序可以轮询那个属性值,以确定结果。
service bootanim /system/bin/bootanimationuser graphicsgroup graphicsdisabledoneshot//定义了一个bootanim的服务,对应执行/system/bin/bootanimation//disabled 表示init进程创建只是创建它,但不立刻执行//oneshot 表示该服务只执行一次当android系统boot时,开始加载动画和开机铃声,其代码位于//源文件SurfaceFlinger.cppstatus_t SurfaceFlinger::readyT oRun(){// start boot animation serviceproperty_set("ctl.start", "bootanim");//}当Android完成boot后,关闭动画和开机铃声,代码位于//源文件SurfaceFlinger.cppvoid SurfaceFlinger::bootFinished(){//stop bootanim serviceproperty_set("ctl.stop", "bootanim");}在Android系统中,长按Power键默认会弹出对话框让你选择“飞行模式”,“静音”,“关机”等功能。
⼿把⼿教你Android全局触摸事件监听Android系统全局触摸事件监听Android触摸全局监听指的是调⽤监听后在任何界⾯都能获取到触摸事件。
要实现这个功能必须要修改源码添加新的接⼝,因为系统默认是不暴露这个⽅法的。
源码监听系统全局触摸事件的类和相关代码:frameworks\base\services\core\java\com\android\server\wm\WindowManagerService.java@Overridepublic void registerPointerEventListener(PointerEventListener listener, int displayId) {Slog.i(TAG, "registerPointerEventListener PointerEventListener = " + listener);synchronized (mGlobalLock) {final DisplayContent displayContent = mRoot.getDisplayContent(displayId);if (displayContent != null) {displayContent.registerPointerEventListener(listener);}}}@Overridepublic void unregisterPointerEventListener(PointerEventListener listener, int displayId) {synchronized (mGlobalLock) {final DisplayContent displayContent = mRoot.getDisplayContent(displayId);if (displayContent != null) {displayContent.unregisterPointerEventListener(listener);}}}第⼀个参数:是中PointerEventListener接⼝,⾥⾯有MotionEvent对象含有点击事件,⽐如DOWN、UP、MOVING等其他信息。
Android开发20——单个监听器监听多个按钮点击事件一、单个按钮点击事件的监听方法一1.* 从网络上获取图片2.* @author 徐越3.public class MainActivity extends Activity4.private EditText txtPath;5.private Button btnShowImage;6.private ImageView imgView;7.@Override8.public void onCreate(Bundle savedInstanceState)9.super.onCreate(savedInstanceState);10.setContentView(yout.main);11.txtPath = (EditText) this.findViewById(R.id.txtPath);12.btnShowImage = (Button) this.findViewById(R.id.btnShowImage);13.imgView = (ImageView) this.findViewById(R.id.imgView);14.btnShowImage.setOnClickListener(new ShowImageListener());15.private final class ShowImageListener implementsView.OnClickListener16.@Override17.public void onClick(View v)18.// 图片路径19.String path = txtPath.getText().toString();20.try21.// 获取图片的二进制数据22.byte[] imgdata = ImageService.getImage(path);23.// 利用Bitmap工厂生成Bitmap24.Bitmap bitmap = BitmapFactory.decodeByteArray(imgdata, 0, imgdata.length);25.// imageView接收Bitmap并显示26.imgView.setImageBitmap(bitmap);27.catch (Exception e)28.Toast.makeText(MainActivity.this, "读取图片失败", Toast.LENGTH_SHORT).show();方法二在布局页面中给该按钮加上android:onClick="showImage",然后再显示该元素的Activity中加入showImage(View v)的方法,在该方法中进行操作。
Android的事件处理机制之基于监听的事件处理⽆论是桌⾯应⽤还是⼿机应⽤程序,⾯对⽤户的使⽤,经常需要处理的便是⽤户的各种动作,也就是需要为⽤户动作提供响应,这种为⽤户动作提供响应的机制就是事件处理。
⽽Android为我们提供了两套强⼤的响应机制:基于监听的事件处理和基于回调的事件处理。
本⽂这次讨论的便是基于监听的事件处理。
对于Android基于监听的事件处理⽽⾔,主要做法就是为Android界⾯组件绑定特定的事件监听器,除此之外Android还允许在界⾯⽂件为UI组件的android:onClick属性指定事件监听⽅法,通过这种⽅式指定监听⽅法时,开发者需要在activity中定义该事件监听⽅法,当⽤户单击该UI组件时,系统将会激发android:onClick属性所指定的⽅法。
监听的处理模型基于监听的事件处理是⼀种更“⾯向对象”的事件处理,这种处理⽅式与Java的AWT、Swing的处理⽅式⼏乎完全相同。
在事件的处理模型中,主要涉及以下三类对象:Event Source(事件源):事件发⽣的场所,通常就是各个组件,例如按钮、窗⼝、菜单等Event(事件):事件封装了界⾯组件上发⽣的特定事情(通常就是⼀次⽤户操作)。
如果程序需要获得界⾯组件上所发⽣事件的相关信息。
⼀般通过Event来取得。
Event Listener(事件监听器):负责监听事件源所发⽣的事件,并对各种事件做出相应的响应。
⽽这些响应动作实际上就是⼀系列程序语句,通常以⽅法的形式组织起来,作为事件监听器的核⼼——这些⽅法也被称为事件处理器(Event Handler);当⽤户按下⼀个按钮或者⼀个菜单项时,这些动作便会激发⼀个相应的事件,该事件就会触发事件源上注册的事件监听器,事件监听器调⽤对应的事件处理器来做出相应的相应。
基于监听的事件处理机制是⼀种委派式(Delegation)事件处理⽅式:普通组件(事件源)将整个事件处理委托给特定对象(事件监听器);当该事件源发⽣指定事件时,就通知所委派的事件监听器,由事件监听器来处理整个事件。
Android教程之开机流程全⾯解析本⽂详细讲述了Android的开机流程。
分享给⼤家供⼤家参考,具体如下:开机过程中⽆线模块的初始化过程;如果sim卡锁开启,或者pin被锁住的时候,会要求输⼊pin或者puk,但是这个解锁动作必须在系统初始化完成以后才能进⾏。
(图形系统都还没有初始化怎么输⼊密码阿?)当系统初始化完成以后会调⽤wm.systemReady()来通知⼤家。
这时候该做什么就做什么。
开机过程中⽆线模块的初始化过程:rild 调⽤参考实现 Reference-ril.c (hardware\ril\reference-ril) 中的函数:const RIL_RadioFunctions *RIL_Init(const struct RIL_Env *env, int argc, char **argv)ret = pthread_create(&s_tid_mainloop, &attr, mainLoop, NULL);static void *mainLoop(void *param)ret = at_open(fd, onUnsolicited);RIL_requestTimedCallback(initializeCallback, NULL, &TIMEVAL_0);在 initializeCallback 函数中对猫进⾏了初始化。
static void initializeCallback(void *param){ATResponse *p_response = NULL;int err;setRadioState (RADIO_STATE_OFF);at_handshake();/* note: we don't check errors here. Everything important willbe handled in onATTimeout and onATReaderClosed *//* atchannel is tolerant of echo but it must *//* have verbose result codes */at_send_command("ATE0Q0V1", NULL);/* No auto-answer */at_send_command("ATS0=0", NULL);/* Extended errors */at_send_command("AT+CMEE=1", NULL);/* Network registration events */err = at_send_command("AT+CREG=2", &p_response);/* some handsets -- in tethered mode -- don't support CREG=2 */if (err < 0 || p_response->success == 0) {at_send_command("AT+CREG=1", NULL);}at_response_free(p_response);/* GPRS registration events */at_send_command("AT+CGREG=1", NULL);/* Call Waiting notifications */at_send_command("AT+CCWA=1", NULL);/* Alternating voice/data off */at_send_command("AT+CMOD=0", NULL);/* Not muted */at_send_command("AT+CMUT=0", NULL);/* +CSSU unsolicited supp service notifications */at_send_command("AT+CSSN=0,1", NULL);/* no connected line identification */at_send_command("AT+COLP=0", NULL);/* HEX character set */at_send_command("AT+CSCS=\"HEX\"", NULL);/* USSD unsolicited */at_send_command("AT+CUSD=1", NULL);/* Enable +CGEV GPRS event notifications, but don't buffer */at_send_command("AT+CGEREP=1,0", NULL);/* SMS PDU mode */at_send_command("AT+CMGF=0", NULL);#ifdef USE_TI_COMMANDSat_send_command("AT%CPI=3", NULL);/* TI specific -- notifications when SMS is ready (currently ignored) */at_send_command("AT%CSTAT=1", NULL);#endif /* USE_TI_COMMANDS *//* assume radio is off on error */if (isRadioOn() > 0) {setRadioState (RADIO_STATE_SIM_NOT_READY);}}默认状况下假设射频模块是好的,通过 setRadioState (RADIO_STATE_SIM_NOT_READY) 来触发对⽆线模块的初始化。