如何提升ACTION 如何才能提高自我的管理能力

\u5982\u4f55\u81ea\u6211\u63d0\u5347\uff1f

\u85ff\u9999\u6742\u5b66\u574a\uff1a\u7b2c55\u8bdd

\u3000\u3000\u8981\u63d0\u9ad8\u81ea\u5df1\u7684\u7ba1\u7406\u80fd\u529b\uff0c\u5373\u4ece\u6839\u672c\u4e0a\u8bf4\u5c31\u662f\u63d0\u9ad8\u81ea\u5df1\u7684\u6c9f\u901a\u80fd\u529b\u3001\u51b3\u65ad\u548c\u5e94\u53d8\u80fd\u529b\u3001\u89c4\u5212\u4e0e\u534f\u8c03\u80fd\u529b\u3001\u51b3\u7b56\u4e0e\u6267\u884c\u80fd\u529b\u3001\u6fc0\u52b1\u548c\u8bad\u7ec3\u80fd\u529b\u3001\u9886\u5bfc\u548c\u7edf\u7b79\u80fd\u529b\u7b49\uff0c\u6574\u4f53\u4e0a\u9700\u8981\u4e0d\u65ad\u5730\u5b66\u4e60\u548c\u66f4\u65b0\u81ea\u5df1\u77e5\u8bc6\uff0c\u6539\u53d8\u81ea\u5df1\u7684\u89c2\u5ff5\uff0c\u505a\u5230\u4e0e\u65f6\u4ff1\u8fdb\uff0c\u8fd8\u8981\u4e0d\u65ad\u5730\u63d0\u9ad8\u81ea\u8eab\u7d20\u8d28\uff0c\u96c6\u601d\u5e7f\u76ca\u3001\u535a\u91c7\u4f17\u957f\uff0c\u4e0d\u65ad\u953b\u70bc\u5bf9\u6574\u4e2a\u7ba1\u7406\u8fc7\u7a0b\u8fdb\u884c\u89c4\u5212\u53d1\u5c55\u3001\u8fdc\u666f\u5c55\u671b\u7684\u80fd\u529b\u3002

\u3000\u3000\u5177\u4f53\u5728\u6bcf\u4e00\u4e2a\u65b9\u9762\u4e0a\uff0c\u5e94\u8be5\u505a\u5230\uff1a
\u3000\u3000\u4e00\u3001\u6c9f\u901a\u80fd\u529b\u3002
\u3000\u3000\u8981\u63d0\u9ad8\u81ea\u5df1\u7684\u6c9f\u901a\u80fd\u529b\uff0c\u9700\u8981\u5584\u4e8e\u503e\u542c\u3002\u4e00\u822c\u6765\u8bf4\uff0c\u57f9\u517b\u81ea\u5df1\u7684\u6c9f\u901a\u80fd\u529b\u5e94\u4ece\u4e24\u4e2a\u65b9\u9762\u52aa\u529b\uff1a\u4e00\u662f\u63d0\u9ad8\u7406\u89e3\u522b\u4eba\u7684\u80fd\u529b\uff1b\u4e8c\u662f\u63d0\u9ad8\u8868\u8fbe\u80fd\u529b\u3002\u60df\u6709\u5982\u6b64\uff0c\u624d\u80fd\u66f4\u591a\u7684\u8ba4\u540c\u611f\u3001\u7406\u89e3\u7a0b\u5ea6\u53ca\u5171\u9e23\u3002
\u3000\u3000\u4e8c\u3001\u51b3\u65ad\u548c\u5e94\u53d8\u80fd\u529b\u3002
\u3000\u3000\u5bf9\u4e8e\u60c5\u8282\u4e25\u91cd\u7684\u51b2\u7a81\uff0c\u6216\u8005\u5bf9\u7acb\u9762\u7684\u77db\u76fe\u4e8b\u4ef6\uff0c\u8981\u6709\u6b63\u786e\u52a0\u4ee5\u6392\u89e3\u7684\u80fd\u529b\u3002\u5373\u4f7f\u5728\u72b6\u51b5\u4e0d\u660e\u3001\u662f\u975e\u4e0d\u6e05\u7684\u65f6\u5019\uff0c\u4e5f\u6709\u5373\u65f6\u91c7\u53d6\u964d\u6e29\u3001\u51b7\u5374\u7684\u624b\u6bb5\uff0c\u5e76\u4e14\u5728\u4e86\u89e3\u60c5\u51b5\u540e\uff0c\u80fd\u591f\u7acb\u523b\u4ee5\u59a5\u5584\u3001\u6709\u6548\u7684\u7b56\u7565\u5316\u89e3\u51b2\u7a81\u7684\u80fd\u529b\u3002\u56e0\u6b64\u5e94\u8be5\u901a\u8fc7\u4e0d\u65ad\u953b\u70bc\uff0c\u57f9\u517b\u89c4\u5212\u4e0e\u534f\u8c03\u610f\u8bc6\uff0c\u628a\u63e1\u6d88\u9664\u77db\u76fe\u7684\u5148\u53d1\u6743\u548c\u4e3b\u52a8\u6743\u3002

\u3000\u3000\u4e09\u3001\u89c4\u5212\u4e0e\u534f\u8c03\u80fd\u529b\u3002
\u3000\u3000\u4e2a\u4eba\u7684\u89c4\u5212\u80fd\u529b\uff0c\u5fc5\u987b\u6df1\u8c0b\u8fdc\u8651\u3001\u6709\u8fdc\u89c1\uff0c\u4e0d\u80fd\u76ee\u5149\u5982\u8c46\uff0c\u8fdb\u884c\u51b3\u7b56\u89c4\u5212\u65f6\uff0c\u66f4\u8981\u80fd\u59a5\u5584\u8fd0\u7528\u7edf\u6574\u80fd\u529b\uff0c\u6709\u6548\u5730\u5229\u7528\u522b\u4eba\u7684\u667a\u6167\u4e0e\u65e2\u6709\u7684\u8d44\u6e90\uff0c\u907f\u514d\u4eba\u529b\u6d6a\u8d39\u3002

\u3000\u3000\u56db\u3001\u51b3\u7b56\u4e0e\u6267\u884c\u80fd\u529b\u3002
\u3000\u3000\u5206\u6d3e\u5de5\u4f5c\u3001\u4eba\u529b\u534f\u8c03\u3001\u5316\u89e3\u5458\u5de5\u7eb7\u4e89\u7b49\u7b49\uff0c\u8fd9\u90fd\u5f80\u5f80\u8003\u9a8c\u7740\u7ba1\u7406\u8005\u7684\u51b3\u65ad\u80fd\u529b\u3002\u56e0\u6b64\uff0c\u5e94\u8be5\u8981\u6709\u5168\u5c40\u610f\u8bc6\uff0c\u4e0d\u80fd\u53ea\u7ad9\u5728\u4e2a\u4eba\u89d2\u5ea6\u548c\u90e8\u95e8\u7acb\u573a\u4e0a\u770b\u95ee\u9898\uff0c\u8981\u52a0\u5f3a\u534f\u4f5c\u914d\u5408\u3002\u51b3\u7b56\u3001\u89c4\u7ae0\u5236\u5ea6\u548c\u5404\u9879\u5de5\u4f5c\u7684\u5f00\u5c55\u90fd\u8981\u6267\u884c\u5230\u4f4d\uff0c\u8981\u8d35\u5728\u843d\u5b9e\uff0c\u8d35\u5728\u6548\u80fd\u3002
\u3000\u3000\u4e94\u3001\u6fc0\u52b1\u548c\u8bad\u7ec3\u80fd\u529b\u3002
\u3000\u3000\u7ba1\u7406\u8005\u5fc5\u7136\u6e34\u671b\u62e5\u6709\u4e00\u4e2a\u5b9e\u529b\u575a\u5f3a\u7684\u5de5\u4f5c\u56e2\u961f\uff0c\u56e0\u6b64\uff0c\u6fc0\u52b1\u548c\u8bad\u7ec3\u80fd\u529b\uff0c\u5bf9\u4e8e\u961f\u4f0d\u5efa\u8bbe\u5f88\u91cd\u8981\u3002\u6fc0\u52b1\u6c34\u5e73\u7684\u9ad8\u4f4e\u4e3b\u8981\u53d6\u51b3\u4e8e\u6fc0\u52b1\u76ee\u6807\u5bf9\u4eba\u7684\u5438\u5f15\u529b \u3001\u5b9e\u73b0\u76ee\u6807\u7684\u53ef\u80fd\u6027\u548c\u516c\u5e73\u611f \u3002

\u3000\u3000\u516d\u3001\u9886\u5bfc\u548c\u7edf\u7b79\u80fd\u529b\u3002\u5f53\u4e00\u4e2a\u7ba1\u7406\u8005\u7684\u5148\u51b3\u6761\u4ef6\uff0c\u5c31\u662f\u8981\u6709\u80fd\u529b\u5efa\u7acb\u56e2\u961f\uff0c\u624d\u80fd\u8fdb\u4e00\u6b65\u5efa\u6784\u4f01\u4e1a\u3002\u56e0\u6b64\u901a\u8fc7\u80fd\u529b\uff0c\u8d62\u5f97\u5458\u5de5\u7684\u4fe1\u4efb\u90fd\u662f\u9996\u8981\u7684\u6761\u4ef6\u3002

如何提升ACTION_SIM_STATE_CHANGED的接收速度?

在Android中,BroadcastReceiver分动态注册和静态注册. 静态注册的一个优势就是:当你的BroadcastReceiver可以接受系统中
某个broadcast时,系统会自动启动你的程序,从而让BroadcastReceiver完成相关处理; 而动态注册则只有在程序运行时且没有
unregisterReceiver才能接收到broadcast.
此时,假设我们要在系统开机后,要对SIM卡联系人进行读取操作,那么我们应该如何注册自己的BroadcastReceiver呢?
方案一:
通过静态注册receiver来处理ACTION_SIM_STATE_CHANGED的broadcast,当icc state为LOADED时,读取SIM卡联系人.
这是一种比较常规的做法. 但是这个方案有一个比较严重的问题,那就是接收到broadcast的时机太晚了。结果就是,可能开机几
分钟过去了,SIM卡联系人却还没加载出来。
通过查看IccCardProxy中broadcastIccStateChangedIntent()函数的代码,我们发现,它发送的就是一个sticky broadcast
ActivityManagerNative.broadcastStickyIntent(intent, READ_PHONE_STATE, UserHandle.USER_ALL)

按照常理来推断,一个sticky的broadcast不应该需要耗时这么久的。
那问题究竟出在什么地方了呢?
在调查这个问题之前,我们先简单看一下,静态注册的receiver和动态注册的receiver是如何被管理的呢?
静态注册receiver:
简单讲,系统启动时,创建PackageManagerService对象,简称PMS,然后通过scanDirLI函数对各个路径进行扫描,保存receiver等等
main[] // PackageManagerService.java
PackageManagerService()
scanDirLI()
scanPackageLI(File scanFile, int parseFlags, int scanFlags, long currentTime, UserHandle user)
parsePackage() // PackageParser.java
// scanPackageLI(PackageParser...)调用scanPackageDirtyLI来进一步处理parsePackage()生成的PackageParser.Package对象pkg
// scanPackageDirtyLI将pkg中的receiver添加到PMS的mReceivers中(具体代码:mReceivers.addActivity(a, "receiver")),
// 并将pkg添加到PMS的mPackages中(具体代码:mPackages.put(pkg.applicationInfo.packageName, pkg))
scanPackageLI(PackageParser.Package pkg, int parseFlags, int scanFlags, long currentTime, UserHandle user) // PackageManagerService.java
parseBaseApk(File apkFile, AssetManager assets, int flags) // PackageParser.java
parseBaseApk(Resources res, XmlResourceParser parser, int flags, String[] outError)
parseBaseApplication() // // 将生成的receiver放到receivers中

} else if (tagName.equals("receiver")) {
Activity a = parseActivity(owner, res, parser, attrs, flags, outError, true, false);
if (a == null) {
mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
return false;
}

owner.receivers.add(a);

} else if (tagName.equals("service")) {

通过上面的简单分析,我们可以发现所有静态注册的receiver是通过PMS进行管理的.
动态注册的receiver:
相比静态注册,动态注册的流程要简单许多.
registerReceiver(BroadcastReceiver receiver, IntentFilter filter) // ContextImpl.java
registerReceiver(BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler)
registerReceiverInternal()
registerReceiver() // AMS
在AMS的registerReceiver函数中,receiver和broadcast filter相关信息被放到了mRegisteredReceivers和mReceiverResolver中.
了解了静态注册和动态注册receiver在PMS和AMS中的大致流程后,再来看下IccCardProxy发送sticky broadcast时AMS的大概流程.
broadcastStickyIntent(intent, READ_PHONE_STATE, UserHandle.USER_ALL) // ActivityManagerNative.java
broadcastIntent() // ActivityManagerService.java 简称AMS
broadcastIntentLocked()
下面贴一下broadcastIntentLocked中比较重要的处理

private final int broadcastIntentLocked(ProcessRecord callerApp,
String callerPackage, Intent intent, String resolvedType,
IIntentReceiver resultTo, int resultCode, String resultData,
Bundle map, String requiredPermission, int appOp,
boolean ordered, boolean sticky, int callingPid, int callingUid,
int userId) {
intent = new Intent(intent);

// By default broadcasts do not go to stopped apps.
intent.addFlags(Intent.FLAG_EXCLUDE_STOPPED_PACKAGES);

......

userId = handleIncomingUser(callingPid, callingUid, userId,
true, ALLOW_NON_FULL, "broadcast", callerPackage);
......
/*
* Prevent non-system code (defined here to be non-persistent
* processes) from sending protected broadcasts.
*/
int callingAppId = UserHandle.getAppId(callingUid);

......

// Figure out who all will receive this broadcast.
List receivers = null; // PMS中的结果
List<BroadcastFilter> registeredReceivers = null; // AMS中的结果
// Need to resolve the intent to interested receivers...
if ((intent.getFlags()&Intent.FLAG_RECEIVER_REGISTERED_ONLY)
== 0) {
// 向PMS查询符合条件的receiver
receivers = collectReceiverComponents(intent, resolvedType, callingUid, users);
}
if (intent.getComponent() == null) {
if (userId == UserHandle.USER_ALL && callingUid == Process.SHELL_UID) {
......
} else {
// 向AMS查询符合条件的receiver
registeredReceivers = mReceiverResolver.queryIntent(intent,
resolvedType, false, userId);
}
}

final boolean replacePending =
(intent.getFlags()&Intent.FLAG_RECEIVER_REPLACE_PENDING) != 0;

......

// 注意,这里用的是从AMS中查询出来的符合条件的receiver
int NR = registeredReceivers != null ? registeredReceivers.size() : 0;
if (!ordered && NR > 0) {
// If we are not serializing this broadcast, then send the
// registered receivers separately so they don't wait for the
// components to be launched.
final BroadcastQueue queue = broadcastQueueForIntent(intent);
BroadcastRecord r = new BroadcastRecord(queue, intent, callerApp,
callerPackage, callingPid, callingUid, resolvedType, requiredPermission,
appOp, registeredReceivers, resultTo, resultCode, resultData, map,
ordered, sticky, false, userId);
if (DEBUG_BROADCAST) Slog.v(
TAG, "Enqueueing parallel broadcast " + r);
final boolean replaced = replacePending && queue.replaceParallelBroadcastLocked(r);
if (!replaced) {
queue.enqueueParallelBroadcastLocked(r);
queue.scheduleBroadcastsLocked();
}
registeredReceivers = null;
NR = 0;
}

......

if ((receivers != null && receivers.size() > 0)
|| resultTo != null) {
BroadcastQueue queue = broadcastQueueForIntent(intent);
BroadcastRecord r = new BroadcastRecord(queue, intent, callerApp,
callerPackage, callingPid, callingUid, resolvedType,
requiredPermission, appOp, receivers, resultTo, resultCode,
resultData, map, ordered, sticky, false, userId);
if (DEBUG_BROADCAST) Slog.v(
TAG, "Enqueueing ordered broadcast " + r
+ ": prev had " + queue.mOrderedBroadcasts.size());
if (DEBUG_BROADCAST) {
int seq = r.intent.getIntExtra("seq", -1);
Slog.i(TAG, "Enqueueing broadcast " + r.intent.getAction() + " seq=" + seq);
}
boolean replaced = replacePending && queue.replaceOrderedBroadcastLocked(r);

if (!replaced) {
// 注意,被放到ordered broadcast中了!
queue.enqueueOrderedBroadcastLocked(r);
queue.scheduleBroadcastsLocked();
}
}

return ActivityManager.BROADCAST_SUCCESS;
}

collectReceiverComponents()和mReceiverResolver.queryIntent()是broadcastIntentLocked()中两个重要的函数调用.分别初始化了broadcastIntentLocked()中的receivers和registeredReceivers变量.
collectReceiverComponents()基本是通过调用AppGlobals.getPackageManager().queryIntentReceivers()来查询符合条件的receiver,
也就是PMS的queryIntentReceivers()函数进行查询,进而通过PMS中mReceivers变量的queryIntent来执行查询操作.
可见,collectReceiverComponents()最终查询到的是静态注册的符合条件的receiver.
再来简单看下mReceiverResolver.queryIntent()方法的查询结果. 我们在执行AMS的registerReceiver()时,将broadcast以及broadcast filter相关的
信息放到了mReceiverResolver中,因此,这里查询到的是所有符合条件的动态注册的receiver.
最终,符合条件的静态注册的receiver被保存在broadcastIntentLocked函数中receivers变量中;符合条件的动态注册的receiver被保存在registeredReceivers变量中。
在接下来enqueueParallelBroadcastLocked时,却只使用了registeredReceivers,即动态注册的receiver. 而静态注册的receiver却被enqueueOrderedBroadcastLocked
放到了ordered broadcast队列中!
下面再来简单看下BroadcastQueue对broadcast的处理流程:
scheduleBroadcastsLocked()
handleMessage() // BroadcastQueue$BroadcastHandler
processNextBroadcast()
deliverToRegisteredReceiverLocked() // non-ordered
performReceiveLocked()
scheduleRegisteredReceiver() // ActivityThread$ApplicationThread
performReceive() // LoadedApk$ReceiverDispatcher
mActivityThread.post(args)
run() // LoadedApk$Args
receiver.onReceive(mContext, intent) // 执行BroadcastReceiver的onReceive方法
processCurBroadcastLocked() // ordered
scheduleReceiver() // ActivityThread$ApplicationThread
handleMessage() // ActivityThread$H
handleReceiver() // ActivityThread
receiver.onReceive(context.getReceiverRestrictedContext(), data.intent) // 执行BroadcastReceiver的onReceive方法

由于ordered broadcast是一条一条来处理,也就不难发现为什么我们静态注册的接收ACTION_SIM_STATE_CHANGED的broadcast receiver很晚才能被启动了.
既然静态注册的receiver只能接受ordered broadcast后,如果想提升接收broadcast的速度,那我们只能使用动态注册receiver了。也就引出了我们的第二个方案.
方案二:
通过自定义Application并在自定义Application中动态注册receiver来处理ACTION_SIM_STATE_CHANGED的broadcast,在AndroidManifest.xml中声明时为自定义
的application添加android:persistent="true"属性. 这样就可以大幅提升接收ACTION_SIM_STATE_CHANGED的速度,但这是为什么呢?
在AMS的systemReady()中将通过PMS的getPersistentApplications()获得所有persistent属性为true的程序,并将他们启动起来. 即在进入launcher之前就被启动了.
而我们在自定义的Application的onCreate()中注册receiver, 来接收ACTION_SIM_STATE_CHANGED的broadcast,我们的receiver将被AMS管理,进而我们就可以更
快的接收到broadcast了(参考上文对AMS中broadcastIntentLocked()的分析). 但是这个方案也不是完美的,因为它声明了persistent=“true”,会占用内存以及增加开机时间.
自定义Application的代码:

public class MyApp extends Application {

private BroadcastReceiver mReceiver = new BroadcastReceiver() {

@Override
public void onReceive(Context context, Intent intent) {
// TODO
}
};

@Override
public void onCreate() {
super.onCreate();
IntentFilter intentFilter = new IntentFilter(TelephonyIntents.ACTION_SIM_STATE_CHANGED);
intentFilter.addAction(Intent.ACTION_BOOT_COMPLETED);
registerReceiver(mReceiver, intentFilter);
}

}

在AndroidManifest中的声明:
<application
android:name="MyApp"
android:label="@string/app_name"
android:persistent="true">
...
</application>

不止ACTION_SIM_STATE_CHANGED,其它的broadcast receiver也可以采用方案二的做法来更快速的接收broadcast,就看自己有没有这个需要了.
写的比较仓促,有纰漏之处,敬请批评指正!

  • Web Api鍙奙VC鎬ц兘鎻愬崌鐨勫嚑涓皬鎶宸
    绛旓細瀵瑰搷搴旀祦杩涜鍘嬬缉锛屽叾浣滅敤鏄噺灏戠綉缁滃紑閿锛鎻愰珮绯荤粺鐨勫搷搴旈熷害銆傜洰鍓嶇殑娴忚鍣ㄩ氬父閮芥敮鎸 gzip 鍜 deflate 鍘嬬缉瑙e帇鍔熻兘锛屽洜姝や綘閫氬父鏃犳晥鑰冭檻娴忚鍣ㄧ殑鍏煎鎬ч棶棰樸傚惎鐢 gzip 鍜 deflate 锛屾棦鍙氳繃 IIS 閰嶇疆瀹炵幇锛屽湪 MVC 涓篃鍙氳繃缂栧啓鑷畾涔夌殑 ActionFilter 瀹炵幇銆傚湪鍘嬬缉涔嬪墠鍜屽帇缂╀箣鍚 Stream 鐨勫ぇ灏忓樊寮...
  • 濡備綍鎻愬崌杩愯惀浜哄憳宸ヤ綔鏁堢巼?
    绛旓細瀵艰锛氬叏鐞冩渶骞磋交浜夸竾瀵岃豹瀹濆骇鐨凢acebook鍒涘浜洪┈鍏嬄锋墡鍏嬩集鏍硷紝涓轰簡鎻愬崌鍛樺伐鐨勫伐浣滄晥鐜囷紝浜茶嚜鍋氫簡杩26寮燩PT銆傚浼氱鐞嗘椂闂达紝鏈夊姪浜鎻愰珮鎴戜滑鐨勫伐浣滄晥鐜囷紝鏄瘡涓汉鐨勫繀淇銆1銆佹椂闂翠竴鐩撮兘鏈夛紝灏辩湅浣濡備綍娓呮櫚瑙勫垝銆2銆佲滄瘡澶╁彧缁欒嚜宸卞畨鎺4鍒5灏忔椂鐨勫伐浣溿傗 -鈥斺斿埆鎶婁竴澶╁畨鎺掑緱澶弧銆3銆佲滄湁鏃跺欎綘鍙兘...
  • 鎬庝箞鎻愬崌閫昏緫鎬濈淮璁粌
    绛旓細閭濡備綍鎵嶈兘鎻愰珮鑷繁鐨勯昏緫鎬濈淮鑳藉姏鍛紵1銆佸浼氳繍鐢ㄢ淧REP+A鈥濈殑閫昏緫浜у嚭妯″紡锛歅锛圥oint锛岃鐐/璁虹偣锛夛紝R锛圧eason锛屽師鍥/鐞嗙敱/鏍规嵁锛夛紝E锛圗xample锛屽疄渚/渚嬭瘉锛夛紝P锛圥oint锛夛紝A锛Action锛岃鍔級銆傚湪姝e紡鐨勮皥璇濄佽婕斻佹枃妗堜腑锛屼竴鑸彲浠ラ伒寰笅闈㈢殑閫昏緫/姝ラ锛歅锛氶鍏堬紝绠娲佹槑浜嗙殑琛ㄦ槑鑷繁鐨勮鐐/璁虹偣/...
  • 濡備綍鎵嶈兘鎻愰珮鑷垜鐨勭鐞嗚兘鍔
    绛旓細瑕鎻愰珮鑷繁鐨勭鐞嗚兘鍔涳紝鍗充粠鏍规湰涓婅灏辨槸鎻愰珮鑷繁鐨勬矡閫氳兘鍔涖佸喅鏂拰搴斿彉鑳藉姏銆佽鍒掍笌鍗忚皟鑳藉姏銆佸喅绛栦笌鎵ц鑳藉姏銆佹縺鍔卞拰璁粌鑳藉姏銆侀瀵煎拰缁熺鑳藉姏绛夛紝鏁翠綋涓婇渶瑕佷笉鏂湴瀛︿範鍜屾洿鏂拌嚜宸辩煡璇嗭紝鏀瑰彉鑷繁鐨勮蹇碉紝鍋氬埌涓庢椂淇辫繘锛岃繕瑕佷笉鏂湴鎻愰珮鑷韩绱犺川锛岄泦鎬濆箍鐩娿佸崥閲囦紬闀匡紝涓嶆柇閿荤偧瀵规暣涓鐞嗚繃绋嬭繘琛岃鍒掑彂灞...
  • action2纾佸惛涓鐩存帀
    绛旓細浣犲氨鐢ㄥ畠鐨勯厤浠跺氨濂戒簡銆action2閲囩敤浜1/1.7鑻卞 1.6渭m鐨勪紶鎰熷櫒锛岃繖灏变娇寰楀叾鍦ㄩ潰瀵瑰己鍏夋垨鑰呮殫鍏夌殑鐜涓嬫晥鏋滀細鏇村ソ锛屾暣浣撶敾闈㈡媿鍑烘潵璐ㄦ劅杈冧笂涓浠h繕鏄湁浜嗗緢澶х殑鎻愬崌锛岃屼笖鑹茶皟浣犵敤鍚庢湡涔熸槸鍙互璋冪殑銆傝繕鏈夊叾155掳鐨勮秴骞胯锛屽拰鍏跺湪鐧藉钩琛$殑鍑鸿壊琛ㄧ幇锛岃鍏跺湪澶嶆潅鐨勫厜绾跨幆澧冧笅涔熷彲浠ユ媿鍑哄緢濂界殑鏁堟灉銆
  • 濡備綍閿荤偧鎻愬崌鑷繁鐨勬濈淮鑳藉姏,鐗瑰埆鏄昏緫鎬濈淮鑳藉姏?
    绛旓細浠ヤ笅鏄垜閿荤偧鎻愬崌鎬濈淮鑳藉姏鐨6鐐瑰績寰楋紝浣犲彲浠ュ仛涓涓弬鑰冿細1銆佸璇讳功锛屼负鎬濊冩彁渚涙矁鍦熴傛濈淮鑳藉姏宸殑鏍规湰鍘熷洜鏄璇嗗皯銆佺煡璇嗙Н绱笉澶熴佽閲庣獎銆傛墍浠ヨ骞虫椂瑕佸璇讳功澶氬涔狅紝澧為暱鐭ヨ瘑銆傜煡璇嗙殑鏉ユ簮锛屽寘鎷涔︺侀槄鍘嗐佷互鍙婁笌浜虹殑浜ゆ祦绛夌瓑锛屽叾涓涔︽槸澧為暱鐭ヨ瘑杈冧负绠鍗曘佸箍娉涖佷笖绯荤粺鐨勬柟娉曪紝瑕侀噸瑙嗚捣鏉ャ傚湪闃呰...
  • 钀ラ攢浜哄繀鐪:鍝佺墝濡備綍娣卞害鎻愬崌娑堣垂杞寲鐨凙IDA(S)妯″瀷,浣犲仛瀵逛簡鍚?_鐧惧害...
    绛旓細娣卞害瑙f瀽锛氬搧鐗濡備綍閫氳繃AIDA锛圫锛夋ā鍨鎻愬崌娑堣垂杞寲锛熻惀閿浜哄繀璇 AIDA锛岃惀閿棰嗗煙鐨勪竴鎶婇噾閽ュ寵锛屽叏绉版敞鎰忓姏锛圓ttention锛夈佸叴瓒o紙Interest锛夈佹鏈涳紙Desire锛変笌琛屽姩锛Action锛夛紝鍦19涓栫邯鏈究寮濮嬪奖鍝嶅晢涓氬喅绛栥傚畠鎻忕粯浜嗘秷璐硅呬粠鍙戠幇浜у搧鍒拌喘涔扮殑璺緞锛屽浠婂湪鏁板瓧鏃朵唬锛岃繖涓妯″瀷灏や负閲嶈銆傝鎴戜滑棣栧厛浜嗚В涓涓婣IDA...
  • 澶т紒涓氬伐浣滃彴濡備綍鎻愬崌涓婁笅娓稿崗浣滄晥鐜?
    绛旓細浜屻佽В鍐虫柟妗 Action鈥斿満鏅腑鍙版娊璞¤鑼冨強鏂板崗浣滄柟寮忕殑灞曞紑 闈㈠涓氬姟鐨勫揩閫熷彂灞曢渶瑕,鍚勫崗浣滄柟鐨勯噸澶嶅伐浣滃彲閫氳繃娴佺▼浼樺寲鎻愰珮鏁堢巼銆 鍥犲ぇ浼佷笟鍚庡彴80%浠诲姟鍦烘櫙鍏锋湁寮鸿寰嬫с佸彲瑙勮寖鎬с侀珮澶嶇敤鎬х瓑鐗圭偣,ued涓庡墠绔叡寤,杩涜浜嗚鑼冪害瀹,灏嗗父鐢ㄧ殑浠诲姟鍦烘櫙杩涜妗嗘灦灞傜殑鎶借薄,鍖呮嫭浣嗕笉闄愪簬鍏跺竷灞銆佸唴瀹广佷氦浜掋佸疄鐜,妗嗘灦涓嬬殑闇姹...
  • 濡備綍鎻愬崌闈㈣瘯鑳藉姏
    绛旓細搴旇仒鑰呭湪绠鍘嗕笂鍐欑殑閮芥槸涓浜涗簨鎯呯殑缁撴灉锛屾弿杩拌嚜宸卞仛杩囦粈涔堬紝鍙栧緱浜鎬庢牱鐨勬垚缁╋紝姣旇緝绗肩粺鍜屽娉涳紝闈㈣瘯瀹橀渶瑕佷簡瑙f洿鍔犲叿浣撶殑涓滆タ锛岄棶娓呮鍙戠敓鍦ㄥ簲鑱樿呰韩涓婄殑姣忎竴浠朵簨鐨勬潵榫欏幓鑴夛紝鍙互杩愮敤STAR鎶鏈係鈥曗昐ituation锛屽湪浠涔堟牱鐨勬儏鏅笅锛屽彂鐢熶簡杩欎欢浜嬶紱T鈥曗昑ask锛岀洰鏍囦换鍔℃槸浠涔堬紱A鈥曗Action锛屼负浜嗗畬鎴愪换鍔...
  • 鎵璋撳伐浣滆兘鍔涘己,鍏跺疄灏辨槸鍋氬埌杩6鐐
    绛旓細鐢ㄦ垚鍔熺粡楠屽府鍔╀粬浜,鍒嗕韩鎰熷彈涓庡績寰,姣斿濡備綍鎼炲畾瀹㈡埛鐨,濡備綍涓哄鎴锋彁渚涙湇鍔$殑,濡備綍濂戣屼笉鑸,褰撴椂鏈夌潃鎬庢牱鐨勫績鎬併 杩欎簺鎰熷彈,寰堝疂璐,鑳戒綋鐜板嚭浣犵殑鐢ㄥ績,浣犵殑璇氭伋,涔熻兘缁欏悓浜嬩滑鎻愪緵姝e悜鐨勫姏閲忋 浠ュけ璐ユ暀璁绀轰粬浜,甯姪浠栦汉閬垮潙,闄嶄綆鐘敊鎴愭湰銆 瑕佹兂寤虹珛鑱屽満褰卞搷鍔,闇瑕佹寔缁鎻愬崌涓や釜浣撶郴銆傚叾涓涓氬姟鐭ヨ瘑浣撶郴,鍏朵簩涓氬姟...
  • 扩展阅读:action文件用手机打开 ... 手机怎么做reaction视频 ... action怎么在手机上打开 ... b站reaction视频怎么做 ... 手机录reaction教程 ... 录reaction用什么软件 ... action文件转换pdf ... action官方免费下载 ... 做reaction视频用什么软件 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网