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);

 

}

}

 

……

 

}

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

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