当前位置: 首页 > news >正文

wordpress解压子目录下电商seo优化

wordpress解压子目录下,电商seo优化,宁波网站建设优化排名,北京网站推广读书笔记系列(第一行代码) 5.1 广播机制简介 标准广播:完全异步执行,广播发出后,所有广播接收器几乎都同一时刻收到这条广播(无法被截断)有序广播:同步执行,广播发出后…

读书笔记系列(第一行代码)

5.1 广播机制简介

  • 标准广播:完全异步执行,广播发出后,所有广播接收器几乎都同一时刻收到这条广播(无法被截断)
  • 有序广播:同步执行,广播发出后同一时刻只会有一个广播接收器能收到这条广播消息,前面的接收器可以截断正在传递的广播
    有序广播工作示意图

5.2 接收系统广播

广播接收器可在代码中注册和AndroidManifest.xml中注册,前者为动态注册,后者被称为静态注册。

5.2.1 动态注册监听网络变化

示例代码:

public class MainActivity extends AppCompatActivity {private IntentFilter intentFilter;private NetworkChangeReceiver networkChangeReceiver;@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView((R.layout.activity_main));intentFilter= new IntentFilter();intentFilter.addAction("android.net.conn.CONNECTIVITY_VHANGE");networkChangeReceiver = new NetworkChangeReceiver();registerReceiver(networkChangeReceiver, intentFilter);}@Overrideprotected void onDestroy(){super.onDestroy();unregisterReceiver(networkChangeReceiver);}class NetworkChangeReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent){ConnectivityManager connectionManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo();if(networkInfo != null && networkInfo.isAvailable()){Toast.makeText(context, "network is available", Toast.LENGTH_SHORT).show();}else {Toast.makeText(context, "network is unavailable", Toast.LENGTH_SHORT).show();}Toast.makeText(context, "network changes", Toast.LENGTH_SHORT).show();}}
}

静态注册实现开机启动

<receiverandroid:name=".BootCompleteReceiver"android:enabled="true"android:exported="true"></receiver>

Export属性表示是否允许这个广播接收器接收本程序以外的广播,enable表示是否使用这个广播接收器。

<receiverandroid:name=".BootCompleteReceiver"android:enabled="true"android:exported="true"><intent-filter><action android:name="android.intent.action.BOOT_COMPLETED"/></intent-filter></receiver>

添加了filter就可以过滤了
可以通过左键新建-》其它来新建静态注册广播
广播接收器中不允许开线程,当onReceive方法运行较长时间而没结束时,程序就会报错,所以其中不能添加过多的逻辑或任何耗时操作。

5.3 发送自定义广播

5.3.1 发送标准广播

@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView((R.layout.activity_main));Button button = (Button)findViewById(R.id.button);button.setOnClickListener(new View.OnClickListener(){@Overridepublic void onClick(View v){Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");sendBroadcast(intent);}});}

通过点击按钮发送广播

public class myBroadcastReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(context, "receiverd in myBroadcastReceiver", Toast.LENGTH_SHORT).show();}
}

这里是自定义的接收器

<receiverandroid:name=".myBroadcastReceiver"android:enabled="true"android:exported="true"><intent-filter><action android:name="com.example.broadcasttest.MY_BROADCAST"/></intent-filter></receiver>

在xml中定义过滤的广播类型

5.3.2 发送有序广播

广播是一种跨进程的通信方式

protected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView((R.layout.activity_main));Button button = (Button)findViewById(R.id.button);button.setOnClickListener(new View.OnClickListener(){@Overridepublic void onClick(View v){Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");sendOrderedBroadcast(intent, null);}});}

只需要修改一行代码 sendOrederedBroadcast即可发送有序广播,同时在接收器的xml文件中可以设置优先级

<receiverandroid:name=".myBroadcastReceiver"android:enabled="true"android:exported="true">
<!--            在这里设置优先级--><intent-filter android:priority="100"><action android:name="com.example.broadcasttest.MY_BROADCAST"/></intent-filter></receiver>

如果想要在接收到广播之后就让广播停止继续传递呢,修改onReceive的代码即可

public void onReceive(Context context, Intent intent) {Toast.makeText(context, "receiverd in myBroadcastReceiver", Toast.LENGTH_SHORT).show();
//        停止继续传递abortBroadcast();}

5.4 使用本地广播

前面我们发送和接收的广播全部属于系统全局广播,即发出的广播可以被其他任何应用程序接收到,并且我们也可以接收来自于其他任何应用程序的广播。这样就很容易引起安全性的问题,比如说我们发送的一些携带关键性数据的广播有可能被其他的应用程序截获,或者其他的程序不停地向我们的广播接收器里发送各种垃圾广播。
使用本地广播则发出的广播只能在应用程序内部传递,并且接收器也只能接收来自本应用程序发出的广播。

public class MainActivity extends AppCompatActivity {private IntentFilter intentFilter;private LocalReceiver localReceiver;private LocalBroadcastManager localBroadcastManger;@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView((R.layout.activity_main));localBroadcastManger = LocalBroadcastManager.getInstance(this); //获取实例Button button = (Button) findViewById(R.id.button);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST");localBroadcastManger.sendBroadcast(intent); //发送本地广播}});intentFilter = new IntentFilter();intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");localReceiver = new LocalReceiver();localBroadcastManger.registerReceiver(localReceiver, intentFilter); //注册本地广播监听器}@Overrideprotected void onDestroy(){super.onDestroy();localBroadcastManger.unregisterReceiver(localReceiver);}class LocalReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent){Toast.makeText(context, "received local broadcast", Toast.LENGTH_SHORT).show();}}
}

代码的不同主要在于需要首先获取实例,然后还要有注册。
需要注意的是,本地广播无法通过静态注册来接收。

5.5 使用广播实现强制下线功能

强制下线功能首先需要实现下关闭所有的活动的功能,新建一个ActivityCollector类管理所有的活动

public class ActivityCollector {public static List<Activity> activities = new ArrayList<>();public static void addActivity(Activity activity){activities.add(activity);}public static void removeActivity(Activity activity){activities.remove(activity);}public static void finishAll(){for(Activity activity:activities){if(!activity.isFinishing()){activity.finish();}}}
}

然后创建baseActivity类作为活动的父类,代码如下:

public class BaseActivity extends AppCompatActivity {private ForceOfflineReceiver receiver;@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);ActivityCollector.addActivity(this);}@Overrideprotected void onResume(){super.onResume();IntentFilter intentFilter = new IntentFilter();intentFilter.addAction("com.example.broadcastbestpractice.FORCE_OFFLINE");receiver = new ForceOfflineReceiver();registerReceiver(receiver, intentFilter);}@Overrideprotected void onPause(){super.onPause();if(receiver != null){unregisterReceiver(receiver);receiver = null;}}@Overrideprotected void onDestroy(){super.onDestroy();ActivityCollector.removeActivity(this);}class ForceOfflineReceiver extends BroadcastReceiver{@Overridepublic void onReceive(final Context context, Intent intent){AlertDialog.Builder builder = new AlertDialog.Builder(context);builder.setTitle("warning");builder.setMessage("You are forced to be offline");builder.setCancelable(false);builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int which) {ActivityCollector.finishAll(); //销毁所有活动Intent intent = new Intent(context, LoginActivity.class);context.startActivity(intent); //重新启动loginActivity}});builder.show();}}
}

我们可以注意到,之前编写注册和销毁接收器的时候是在onCreate和onDestroy这两个函数里的,但是上面代码中却写在了onResume和onPause里面,这是因为我们每次都只需要在栈顶的活动接收广播,非栈顶活动没必要接收这条广播。

除此之外,我们创建一个登陆的活动,在活动页面上放置输入框,并编写登录逻辑

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/container"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingBottom="@dimen/activity_vertical_margin"tools:context=".ui.login.LoginActivity"><LinearLayoutandroid:orientation="horizontal"android:layout_width="match_parent"android:layout_height="60dp"tools:ignore="MissingConstraints"><TextViewandroid:layout_width="90dp"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:textSize="18sp"android:text="Account:"/><EditTextandroid:layout_width="0dp"android:layout_height="wrap_content"android:id="@+id/account"android:layout_weight="1"android:layout_gravity="center_horizontal"/></LinearLayout><LinearLayoutandroid:orientation="horizontal"android:layout_width="match_parent"android:layout_height="60dp"tools:ignore="MissingConstraints"><TextViewandroid:layout_width="90dp"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:textSize="18sp"android:text="password:"/><EditTextandroid:layout_width="0dp"android:layout_height="wrap_content"android:id="@+id/password"android:layout_weight="1"android:layout_gravity="center_horizontal"/></LinearLayout><Buttonandroid:layout_width="match_parent"android:layout_height="60dp"android:id="@+id/login"android:text="Login"tools:ignore="MissingConstraints"></Button></androidx.constraintlayout.widget.ConstraintLayout>
public class LoginActivity extends AppCompatActivity {private EditText accountEdit;private EditText passwordEdit;private Button login;@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_login);accountEdit = (EditText) findViewById(R.id.account);passwordEdit = (EditText) findViewById(R.id.password);login = (Button) findViewById(R.id.login);login.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String account = accountEdit.getText().toString();String password = passwordEdit.getText().toString();//如果账号是admin 且密码是123456则登录成功if(account.equals("admin") && password.equals("123456")){Intent intent = new Intent(LoginActivity.this, MainActivity.class);startActivity(intent);finish();}else {Toast.makeText(LoginActivity.this, "account is invalid", Toast.LENGTH_SHORT).show();}}});}
}

这样就模拟了登录的窗口,然后在mainActivity中加入触发强制下线的代码

public class MainActivity extends BaseActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button forceOffline = (Button) findViewById(R.id.force_offline);forceOffline.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent("com.example.broadcastbestpractice.FROCE_OFFLINE");sendBroadcast(intent);}});}
}

这样逻辑就差不多了,下面去AndroidManifest.xml中修改下程序入口即可:

http://www.yidumall.com/news/42.html

相关文章:

  • 邢台做网站费用百度资源分享网页
  • 中山快速做网站价格西安网站建设比较好的公司
  • 婚恋网站上认识人 带你做原油交易网站关键词搜索排名优化
  • 菲律宾做网站html网站模板免费
  • 营销型网站建设实战感想可以搜索国外网站的搜索引擎
  • 国内重大新闻事件2023简短网站优化技巧
  • 网站建设网站公司的序专业优化网站排名
  • 有实力高端网站设计地址媒体网站
  • 网站怎么做长尾词网站运营培训
  • 网站设计开发团队网络销售面试问题有哪些
  • 门户网站建设开发做网站的软件叫什么
  • 做网站教程第一课免费推广软件
  • 河南省罗山县做网站的公司2022最新国内新闻50条简短
  • 哪个网站做外贸好今天最近的新闻
  • 便宜做网站公司百度统计怎么用
  • wordpress 微软雅黑字体seo如何优化的
  • 广州网站设计首选柚米站长资讯
  • 厦门网直播赣州seo培训
  • 轻淘客一键做网站东莞免费网站建设网络营销
  • 广东企业微信网站建设手机seo关键词优化
  • 网站建设案例信息北京seo优化哪家好
  • 代理网站备案表汽车网络营销的方式有哪些
  • 可以搜索附近手机的软件seo排名优化是什么
  • 个人网站做微擎百度主页入口
  • 进入建设银行的网站就打不了字优化设计五年级下册数学答案
  • net网站开发手机网站网络销售怎么学
  • 招聘网站怎么做效果好怎么推广自己的网站
  • 建站网站平台b站推广入口2023年
  • 惠州模板网站线下广告投放渠道都有哪些
  • 免费网站模板建站官网排名优化