android登录注册跳转的代码_Android开发代码

android登录注册跳转的代码_Android开发代码1.用户接口registerReceiverframeworks/base/core/java/android/content/ContextWrapper.java  publicIntentregisterReceiver(BroadcastReceiverreceiver,IntentFilterfilter){    returnmBase.registerRe…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

1. 用户接口registerReceiver

frameworks/base/core/java/android/content/ContextWrapper.java

    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {

        return mBase.registerReceiver(receiver, filter);

    }

frameworks/base/core/java/android/app/ContextImpl.java

    @Override

    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {

        return registerReceiver(receiver, filter, null, null);

    }

    @Override

    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,

            String broadcastPermission, Handler scheduler) {

        return registerReceiverInternal(receiver, getUserId(),

                filter, broadcastPermission, scheduler, getOuterContext(), 0);

    }

    @Override

    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,

            String broadcastPermission, Handler scheduler, int flags) {

        return registerReceiverInternal(receiver, getUserId(),

                filter, broadcastPermission, scheduler, getOuterContext(), flags);

    }

class ContextImpl extends Context {

……

 

@Override

public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {

return registerReceiver(receiver, filter, null, null);

}

 

@Override

public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,

String broadcastPermission, Handler scheduler) {

return registerReceiverInternal(receiver, filter, broadcastPermission,

scheduler, getOuterContext());

}

 

private Intent registerReceiverInternal(BroadcastReceiver receiver,

IntentFilter filter, String broadcastPermission,

Handler scheduler, Context context) {

IIntentReceiver rd = null;

if (receiver != null) {


// mPackageInfo是一个LoadedApk实例,它是用来负责处理广播的接收的
// context 是通过调用函数getOuterContext得到的


if (mPackageInfo != null && context != null) {

if (scheduler == null) {

// mMainThread.getHandler来获得一个Handler了,

                                        //这个Hanlder是后面用来分发ActivityManagerService发送过的广播用的。

// 这里的成员变量mMainThread是一个ActivityThread实例

scheduler = mMainThread.getHandler();

}

rd = mPackageInfo.getReceiverDispatcher(

receiver, context, scheduler,

mMainThread.getInstrumentation(), true);

} else {

……

}

}

try {

   final Intent intent = ActivityManager.getService().registerReceiver(

           mMainThread.getApplicationThread(), mBasePackageName, rd, filter,

           broadcastPermission, userId, flags);

   if (intent != null) {

       intent.setExtrasClassLoader(getClassLoader());

       intent.prepareToEnterProcess();

   }

   return intent;

} catch (RemoteException e) {

return null;

}

}

 

……

 

}

// BroadcastReceiver

frameworks/base/core/java/android/content/BroadcastReceiver.java

// getHandler()

public final class ActivityThread {

……

final H mH = new H();

 

private final class H extends Handler {

……

 

public void handleMessage(Message msg) {

……

 

switch (msg.what) {

……

}

 

……

}

 

……

 

}

……

 

final Handler getHandler() {

return mH;

}

……

}

// 

frameworks/base/core/java/android/app/LoadedApk.java

    public IIntentReceiver getReceiverDispatcher(BroadcastReceiver r,

            Context context, Handler handler,

            Instrumentation instrumentation, boolean registered) {

        synchronized (mReceivers) {

            LoadedApk.ReceiverDispatcher rd = null;

            ArrayMap<BroadcastReceiver, LoadedApk.ReceiverDispatcher> map = null;

            if (registered) {


// ArrayMap<Context, ArrayMap<BroadcastReceiver, ReceiverDispatcher>> mReceivers = new ArrayMap<>();
        //由context获得ArrayMap<BroadcastReceiver, ReceiverDispatcher>>
//由BroadcastReceiver获得ReceiverDispatcher


                map = mReceivers.get(context);

                if (map != null) {

                    rd = map.get(r);

                }

            }

            if (rd == null) {

                rd = new ReceiverDispatcher(r, context, handler, instrumentation, registered);

                if (registered) {

                    if (map == null) {

                        map = new ArrayMap<BroadcastReceiver, LoadedApk.ReceiverDispatcher>();

                        mReceivers.put(context, map);

                    }

                    map.put(r, rd);

                }

            } else {

                rd.validate(context, handler);

            }

            rd.mForgotten = false;


   //获得后就会把它传给ActivityManagerService,以便接收广播

            return rd.getIIntentReceiver();

        }

    }

    static final class ReceiverDispatcher {


//InnerReceiver实例,这是一个Binder对象,实现了IIntentReceiver接口,

//可以通过ReceiverDispatcher.getIIntentReceiver函数来获得,

                //获得后就会把它传给ActivityManagerService,以便接收广播。

final static class InnerReceiver extends IIntentReceiver.Stub {

final WeakReference<LoadedApk.ReceiverDispatcher> mDispatcher;

……

InnerReceiver(LoadedApk.ReceiverDispatcher rd, boolean strong) {

mDispatcher = new WeakReference<LoadedApk.ReceiverDispatcher>(rd);

……

}

……

}

 

……

 

final IIntentReceiver.Stub mIIntentReceiver;

final Handler mActivityThread;

……

ReceiverDispatcher(BroadcastReceiver receiver, Context context,

Handler activityThread, Instrumentation instrumentation,

boolean registered) {

……

 

mIIntentReceiver = new InnerReceiver(this, !registered);

mActivityThread = activityThread;

……

}

……

 

IIntentReceiver getIIntentReceiver() {

return mIIntentReceiver;

}

 

}

 

public class ActivityManagerService extends IActivityManager.Stub

        implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {

……

 

public Intent registerReceiver(IApplicationThread caller, IIntentReceiver receiver, IntentFilter filter, String permission) {

synchronized(this) {


// 函数首先是获得调用registerReceiver函数的应用程序进程记录块

ProcessRecord callerApp = null;

if (caller != null) {

callerApp = getRecordForAppLocked(caller);

if (callerApp == null) {

……

}

}

 

List allSticky = null;

 

// Look for any matching sticky broadcasts…

Iterator actions = filter.actionsIterator();

if (actions != null) {

while (actions.hasNext()) {

String action = (String)actions.next();

allSticky = getStickiesLocked(action, filter, allSticky);

}

} else {

……

}

 

//广播接收器receiver保存一个ReceiverList列表中,这个列表的宿主进程是rl.app,这里就是MainActivity所在的进程了,
//在ActivityManagerService中,用一个进程记录块来表示这个应用程序进程,它里面有一个列表receivers,

//专门用来保存这个进程注册的广播接收器。接着,又把这个ReceiverList列表以receiver为Key值保存在

//ActivityManagerService的成员变量mRegisteredReceivers中,这些都是为了方便在收到广播时,快速找到对应的广播接收器的

ReceiverList rl

= (ReceiverList)mRegisteredReceivers.get(receiver.asBinder());

if (rl == null) {

rl = new ReceiverList(this, callerApp,

Binder.getCallingPid(),

Binder.getCallingUid(), receiver);

 

if (rl.app != null) {

rl.app.receivers.add(rl);

} else {

……

}

mRegisteredReceivers.put(receiver.asBinder(), rl);

}


  //创建一个BroadcastFilter来把广播接收器列表rl和filter关联起来,
//然后保存在ActivityManagerService中的成员变量mReceiverResolver中去


BroadcastFilter bf = new BroadcastFilter(filter, rl, permission);

rl.add(bf);

……

mReceiverResolver.addFilter(bf);

 

}

}

 

……

 

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/197491.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 迁移学习与代码举例

    迁移学习出现背景在有监督的机器学习和尤其是深度学习的场景应用中,需要大量的标注数据。标注数据是一项枯燥无味且花费巨大的任务,关键是现实场景中,往往无法标注足够的数据。而且模型的训练是极其耗时的。因此迁移学习营运而生。传统机器学习(主要指监督学习)基于同分布假设需要大量标注数据然而实际使用过程中不同数据集可能存在一些问题,比如数据分布差异标注数据过期训练数据过期,也就是好不容易标定…

    2022年4月15日
    112
  • Vue(9)购物车练习

    Vue(9)购物车练习购物车案例经过一系列的学习,我们这里来练习一个购物车的案例**需求:**使用vue写一个表单页面,页面上有购买的数量,点击按钮+或者-,可以增加或减少购物车的数量,数量最少不得少于0,点击移除按钮

    2022年8月7日
    3
  • 简单网络管理协议SNMP(史上最全)

    简单网络管理协议SNMP(史上最全)简单网络管理协议(SNMP)是TCP/IP协议簇的一个应用层协议。在1988年被制定,并被Internet体系结构委员会(IAB)采纳作为一个短期的网络管理解决方案;由于SNMP的简单性,在Internet时代得到了蓬勃的发展,1992年发布了SNMPv2版本,以增强SNMPv1的安全性和功能。现在,已经有了SNMPv3版本。SNMP版本…

    2022年10月17日
    0
  • ioctl+FIONREAD判断文件可读

    ioctl+FIONREAD判断文件可读linux下判断一个文件描述符是否可读可用ioctl,参数FIONREAD,包含头文件unistd.hwindows下有个类似的ioctlsocket,实现了ioctl的部分功能,也可以实现同样的功能。https://blog.csdn.net/tgdzsjh/article/details/17142949https://blog.csdn.net/wy_kath/article/d…

    2022年7月23日
    19
  • c++ 常量表达式_c++符号常量

    c++ 常量表达式_c++符号常量常量表达式主要是允许一些计算发生在编译时,即发生在代码编译阶段而不是代码运行阶段。这是很大的优化,因为如果有些事情可以在编译时做,那么它只会做一次,而不是每次程序运行时都计算。使用constexpr,你可以创建一个编译时的函数:constexprintgetConst(){ return3;}voidtest07(){ intarr[getConst()]={0}…

    2022年9月29日
    1
  • 十进制数负三的二进制数补码为_-8的补码

    十进制数负三的二进制数补码为_-8的补码十进制转二进制补码(正负都可)指针初学将一个十进制正(负)整数转换为对应的二进制补码(用指针完成十进制转二进制:1.先判断该整数是正数还是负数如果是正数则二进制补码首位为1,且对应的二进制补码就是原.如果是负数则二进制补码为原码基础上取反且末位加1(加1则涉及进位)代码:#include”stdio.h”#include”Stdio.h…

    2022年10月19日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号