tag 标签: app

相关博文
  • 热度 12
    2022-1-18 18:06
    545 次阅读|
    0 个评论
    Android之WebView用法
    除了 HTTP 通信与 Socket 通信两种主要的网络技术外,在 Android 中还提供了一种加载和显示网页的技术 —WebView 。这可以让我们去处理一些特殊的需求,比如像微信那样在应用程序里展示网页,或者说使用 WebView 来为 UI 界面布局。 WebView 的基本使用 WebView 的使用非常简单,新建一个项目 internet ,修改 activity _ main.xml 中的代码,加入一个 WebView 控件。 WebView 控件是一个新的控件,用于显示网页,为了可以在 Activity 中获取 WebView 而设置了 id ,代码如下 ∶
  • 热度 17
    2021-12-24 14:38
    1166 次阅读|
    0 个评论
    Android之本地广播的使用
    前面我们发送和接收的广播全部属于系统全局广播,即发出的广播可以被其他任何应用程序接收到,并且我们也可以接收来自于其他任何应用程序的广播。这样就很容易会引起安全性的问题,比如说我们发送的一些携带关键性数据的广播有可能被其他的应用程序截获或者其他的程序不停地向我们的广播接收器里发送各种垃圾广播。 为了能够简单地解决广播的安全性问题, Android 引入了一套本地广播机制,使用这个机制发出的广播只能够在应用程序的内部进行传递,并且广播接收器也只能接收来自本应用程序发出的广播,这样所有的安全性问题就都不存在了。另外,发送本地广播比起发送系统全局广播效率更高。 本地广播的用法并不复杂,主要就是使用了一个 LocalBroadcastManager 来对广播进行管理,并提供了发送广播和注册广播接收器的方法。下面我们就通过具体的实例来演示它的用法。 新建一个 CustomReceive 类继承自 BroadcastReceiver ,并重写 onReceive() 方法,代码如下: package com.rfstar.localbroadcasttest; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.widget.Toast; public class CustomReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //获取传递的参数 Bundle bundle=intent.getBundleExtra("data"); String name=bundle.getString("name"); String field=bundle.getString("field"); Toast.makeText(context,"在broadcast应用中接收到广播:"+"接收的广播数据为,名称:"+name+",领域:"+field, Toast.LENGTH_LONG).show(); } } MainActivity代码如下: package com.rfstar.localbroadcasttest; import androidx.appcompat.app.AppCompatActivity; import androidx.localbroadcastmanager.content.LocalBroadcastManager; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.view.View; import android.widget.Button; public class MainActivity extends AppCompatActivity { private LocalBroadcastManager localBroadcastManager; private CustomReceiver customReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); localBroadcastManager=LocalBroadcastManager.getInstance(this); Button send=(Button)findViewById(R.id.send); send.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //建立一个意图,action为com.rfstar.action.NORMAL_BROADCAST Intent intent=new Intent("com.rfstar.action.NORMAL_BROADCAST"); Bundle bundle=new Bundle(); bundle.putString("name","大鸟科创空间"); bundle.putString("field","科技"); //向意图中加入数据 intent.putExtra("data",bundle); //发送广播,普通广播 localBroadcastManager.sendBroadcast(intent); } }); IntentFilter intentFilter=new IntentFilter(); intentFilter.addAction("com.rfstar.action.NORMAL_BROADCAST"); customReceiver=new CustomReceiver(); localBroadcastManager.registerReceiver(customReceiver,intentFilter); } @Override protected void onDestroy() { super.onDestroy(); localBroadcastManager.unregisterReceiver(customReceiver); } } MainActivity对应的布局文件代码如下,创建一个发送广播的Button按钮。
  • 热度 23
    2021-12-15 12:50
    731 次阅读|
    0 个评论
    自定义广播实例
    我们应该已经学会了通过广播接收者来接收系统广播的内容,但是在 实际 开发中,仍需要自定义一些广播。 下面 我们就来讲解如何在应用程序中发送自定义的广播。 发送广播很简单,只需要声明一个意图,然后使用 Context.sendBroadcast () 方法发送意图即可。这里在布局文件中加入一个 Button 按钮来触发发送广播的事件 ,activity_main.xml 代码如下:
  • 热度 21
    2021-12-7 13:04
    619 次阅读|
    0 个评论
    Android之动态注册广播实例
    Android 内置了很多系统级别的广播,我们可以在应用序中通过监听这些广播来得到各 种系统 的状态信息,比如手机开机完成后会发出一条广播、电池的电最发生变化会发出一条广 播、 时间或时区发生改变也会发出一条广播等。 想 要实现广播的 接 收,就需要使用广播按收者。广播 接 收者可以自由地对自己感兴 趣 的 进 行注册。当有相 应 的广播发出时,广播 接 收者 就 能够收到该广播。 并 在内部处理相应的 逻辑 ,注册广 播 的方式一般有两种 , 在代码中注册和在 Androi dMan ifest . xml 中 注 册,其中的 前者 被 称 为动态注册,后者 被 称为静态注册。下面分别通过检测电话状态(动态注册)以及应用 开 机自动 ( 静 态注册 ) 两个实例来讲解系统广播的具体 用 法。 动态注册广播实例 这 里通 过一个检测电话状态的实例来讲解如何动态 注 册广 播 。在实例中如 果 想要 接 收到 这些 电话状态的广 播就 需要使用广播接收者。实现一个广播接收者只需要新建一个 继承自 BroadcastReceiver 类的子类并重写父类的 onR e ceive () 方法就行了。这样当有广播到来时 . onRceive () 方法 就会 得到执行,具体的业务逻编只需 在 onR e ceive () 方法中处理或可以了。 下面我们通过来看实例代码,新建一个 Activity 类,动态注册广播。当然这里需要注意权限问题,读取电话状态是一个危险权限,除了要在 AndroidManifest.xml 文件中加入如下代码: 还需要动态获取相关权限,下面是 MainActivity 的代码: package com.rfstar.broadcasttest; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import android.Manifest; import android.content.Context; import android.content.IntentFilter; import android.content.pm.PackageManager; import android.os.Build; import android.os.Bundle; import android.widget.Toast; public class MainActivity extends AppCompatActivity { private CallReceiver callReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getPermission(); } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(callReceiver); } private void setCallReceiver() { callReceiver=new CallReceiver(); IntentFilter filter=new IntentFilter(); filter.addAction("android.intent.action.PHONE_STATE"); filter.addAction("android.intent.action.NEW_OUTGOING_CALL"); registerReceiver(callReceiver,filter); } private void getPermission() { //判断版本号,在api23也就是6.0版本之前能直接获得权限 =23) { int checkCALLPermission= ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE); int checkOutCALLPermission=ContextCompat.checkSelfPermission(this, Manifest.permission.PROCESS_OUTGOING_CALLS); //判断是否具有权限 if(checkCALLPermission!= PackageManager.PERMISSION_GRANTED||checkOutCALLPermission!=PackageManager.PERMISSION_GRANTED) { //用以申请权限的方法,此时使用ActivityCompat类的该方法,以便于版本兼容 ActivityCompat.requestPermissions(this,new String permissions,int ==PackageManager.PERMISSION_GRANTED){ Toast.makeText(this,"获取权限成功",Toast.LENGTH_SHORT).show(); //获取权限成功,动态注册广播接收者 setCallReceiver(); }else{ Toast.makeText(this,"获取权限失败",Toast.LENGTH_SHORT).show(); } break; default: super.onRequestPermissionsResult(requestCode,permissions,grantResults); } } } 在 Activity 类中包括两部分内容 ∶ 一部分是动态获取权限,一部分是动态注册广播。这里只讲解动态注册广播。首先我们创建一个 Inten t Filt er 实例,并为其添加一个值为 android . intent . ac t ion.PHONE _ STATE 的 action 。接下来创建一个 CallReceiver 实例,然后调用 reg i sterRe cei ver () 方法进行注册,将 CallReceive r 的实例和 IntentFilter 的实例都传进去,这样 Ca l lRe c eiver 就会收到所有值为 android . intent . action.PHONE _ STATE 的广播,也就实现了监听电语状态的功能。一般情况下,动态注册的广播接收器一定要取消注册才行,取消注册通过在 onDestroy () 方法中通过调用 unregisterReceiver () 方法来实现。 新建一个继承自 BroadcastReceiver 类的 CallReceiver 类,用来获得用户拨打的电话号码以及接听、挂断等状态的变化,修改拨出的号码,加上一个 IP 拨号码,代码如下: package com.rfstar.broadcasttest; import android.app.Service; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.telephony.TelephonyManager; import android.widget.Toast; public class CallReceiver extends BroadcastReceiver { boolean flag=false; @Override public void onReceive(Context context, Intent intent) { //判断是来电还是去电 if(intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)){ //标识当前是拨出电话 flag=false; //获取当前号码 String phoneNumber=intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER); Toast.makeText(context,"电话已拨出,号码为:"+phoneNumber,Toast.LENGTH_LONG).show(); //将拨出的号码改为代码12159的号码 setResultData("12159"+phoneNumber); }else{ //此时监控来电时状态 //获取电话服务管理器 TelephonyManager TelephonyManager telephonyManager=(TelephonyManager)context.getSystemService(Service.TELEPHONY_SERVICE); switch (telephonyManager.getCallState()) { //电话处于响铃状态 case TelephonyManager.CALL_STATE_RINGING: //标识当前是来电 flag=true; //获取来电号码 String incomingPhoneNumber=intent.getStringExtra("incoming_number"); Toast.makeText(context,"来电号码:"+incomingPhoneNumber,Toast.LENGTH_LONG).show(); break; case TelephonyManager.CALL_STATE_OFFHOOK: if(flag){ Toast.makeText(context,"来电已被接通",Toast.LENGTH_LONG).show(); } break; case TelephonyManager.CALL_STATE_IDLE: if(flag){ Toast.makeText(context,"来电已被挂断",Toast.LENGTH_LONG).show(); } break; } } } } 在 onReceive () 方法中,首先通过 intent.getAction () 来判断是拨出电话还是外部来电。如果是拨出电话就获取拨出的号码,然后用 Toast 展示此号码,并使用 setResultData () 方法将此 号码 修改为带 IP 的号码进行拨号。如果是来电,就先通过 getSystemService () 方法获取 TelephonyManager 实例。这是一个系统服务类,专门用于管理通话。然后可以调用它的 g e t SystemService() 方法得到通话处于什么样状态,再根据不同的状态使用 Toast 展示不同的信息。 运行程序,按 home 键使当前程序进入后台,打开拨号界面,拨打电话,此时在界面上显示的号码就不再是拨出的号码,而是加上 "12159" 后的一个 I P 拨号号码。效果如 下 图所示 。 这里只展示了拨出电话时的效果。有关来电时的效果, 大家 可以使用上例自行测试验证 。 android studio工具及手机模拟器以及更多工程源代码下载请前往微信公众号:大鸟科创空间,回复:android studio即可获取。
  • 热度 14
    2021-12-1 16:00
    816 次阅读|
    0 个评论
    android之广播机制介绍
    广播( Broadcast )是一种广泛用于应用程序之间传递消息的机制,是 Android 系统的四大组件之一。广播机制包含 3 个基本要素 ∶ 广播( Broadcast ),用于发送广播 ; 广播接收器( BroadcastReceiver ),用于接收广播 ; 意图内容( Intent ),用于保存广播相关信息的媒介 。 广播分为两个方面 ∶ 广播发送者和广播接收者( Broadcast Receiver ),在 Android 系统中很多操作完成以后都会发送广播,比如说发送短信息、打出一个电话、开机或者网络状态改变和电量改变等。如果某些应用程序想要在这些操作完成以后做一些相应的处理,就可以对这些广播做接收。这个广播跟传统意义中的电台广播有些相似,只是传统电台广播发送的是语音而 Android 系统发送的是目的意图 Intent 。之所以叫广播,就是因为它与传统的广播很相似,只负责播放而不管接收者 " 听不听 " ,也就不管接收方如何处理。 Android 中的每个应用程序都可以对自己需要的广播进行注册,这样该程序就可以接收到自己需要的广播内容,这些广播可能是来自于系统的,也可能是来自于其他应用程序的。 Android 提供了一套完整的 API ,允许应用程序自由地发送和接收广播。 Android 中的广播按照发送类型可以分为两种 : 普通广播和有序广播。 ● 普通广播( Normal broadcasts )是一种完全异步执行的广播,效率较高,在广播发出之后,所有的广播接收者甚至可能会在同一时刻接收到这条广播消息,因此它们之间没有任何先后顺序可言。 ● 有序广播( Ordered broadcasts )则是一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收者能够收到这条广播消息,当这个广播接收者中的逻辑执行完毕后,广播才会继续传递。广播接收者是有先后顺序的,优先级高的广播接收者可以先收到广播消息,并且前面的广播接收者还可以截断正在传递的广播,使后面的广播接收者无法收到广播消息。 在开发中,广播一般会在下面几种情况下使用 ∶ ● 同一 App 内部的同一组件内的消息通信(单个或多个线程之间)。 ● 同一 App 内部的不同组件之间的消息通信(单个进程)。 ● 同一 App 具有多个进程的不同组件之间的消息通信。 ● 不同 App 组件之间的消息通信。 ●Android 系统在特定情况下与 App 之间的消息通信。 在这里我们可以看到 Broadcast 也可以在不同 App 应用之间进行消息通信。如果我们开发一个应用就需要在允许的情况下自动填充短信中的验证码,那么这时要监听用户短信,短信和自己的 App 就处在不同的进程之间。 Activity 和 Service 在某些情况下的通信也可以借助 Broadcast ,这时就是在同一进程不同组件之间的消息通信。 另外,需要注意的是,当我们通过广播接收者处理相应的广播时,不推荐进行任何耗时操作,因为在广播接收器中是不允许开启线程的,当 onReceive () 方法运行了较长时间而没有结束时,程序就会报错。因此广播接收器更多的是 扮 演一种打开程序其他组件的角色,比如创 建一条状态栏通知或者启动一个服务等。 android studio工具及手机模拟器以及更多工程源代码下载请前往微信公众号:大鸟科创空间,回复:android studio即可获取。
相关资源