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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 系统无法开始服务器进程。请检查用户名和密码。 (Exception from HRESULT: 0x8000401A)…[通俗易懂]

    系统无法开始服务器进程。请检查用户名和密码。 (Exception from HRESULT: 0x8000401A)…[通俗易懂]开始-运行-cmd,输入aspnet_regiis.exe-i重新注册iis或者出现以下错误:检索COM类工厂中CLSID为{000209FF-0000-0000-C000-000000000046}的组件失败,原因是出现以下错误:8000401a因为配置标识不正确,系统无法开始服务器进程。请检查用户名和密码。(异常来自HRESULT:0x8000401A)。解决方案:1….

    2022年8月20日
    18
  • 补码的表示 以及+-0的问题「建议收藏」

    补码的表示 以及+-0的问题「建议收藏」正数的补码是其本身,也就是原码.负数的补码是各位取反后加1.也就是其反码加1.+0的补码就是其原码,也就是说是00000000而已(对于8位来说)-0的补码是其反码加1,其反码是11111111,当然,其反码加1后就是溢出一个进位后,仍然是00000000.问题出现在(+0)和(-0)上,在人们的计算概念中零是没有正负之分的。于是就引入了补码概念。负数的补码就是对反码加一,而正数不…

    2025年5月23日
    2
  • curl返回常见错误码

    curl返回常见错误码http://www.cnblogs.com/wainiwann/p/3492939.htmlCURLE_OK(0)所有罚款。继续像往常一样。CURLE_UNSUPPORTED_PROTOCOL(1)你的URL传递给libcurl的使用协议,这libcurl的不支持。支持可能是你没有使用一个编译时的选项,它可以是一个拼写错的协议字符串,或者只是一个协议的libcu

    2022年7月14日
    36
  • 在Pandas中,如何根据Group By 结果计算 Row Number

    在Pandas中,如何根据Group By 结果计算 Row Number例如我们有下面的数据,第一列是用户的ID,第二列是用户的购买日期,现在如果我们需要判断用户是否重复购买,并且,每一次的购买,下一次的购买时间间隔是多少呢?

    2022年5月4日
    79
  • ubuntu20.04安装pycharm_linux下安装软件命令

    ubuntu20.04安装pycharm_linux下安装软件命令PyCharmIDE2019.1现在已经发布了,许多新特性和改进。全新的JupyterNotebook支持、改进了HTML和CSS的快速文档、快速导航到最近的位置、自定义主题插件等等。PyCharm的新功能JupyterNotebook支持,已经完全重新设计。现在可以在PyCharm2019.1中直接编辑Notebook,并提供方便的并排视图,帮助您更好地了解Notebook的源代码,同…

    2022年8月26日
    4
  • android开发之应用Crash自动抓取Log_自动保存崩溃日志到本地

    教你如何抓取应用崩溃日志,保存到本地,或者增加一些友好提示,如果有需要还可以上传到服务器。

    2022年3月11日
    36

发表回复

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

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