⑴ 短視頻平台框架如何開發都有哪些功能
你好,很高興回答你的問題:
短視頻平台框架開發有很多方式,功能也要看運營團隊的需要,在這里推薦一套開發框架給您,僅供參考:
1、 直播系統前端APP是分成安卓端和蘋果端,後端是PC端,開發語言:後台PHP語言 ,android是java語言, IOS是 objective-c,
APP原生開發, PHP 視頻互動系統由 WEB 系統、REDIS 服務、MYSQL 服務、視頻服務、聊天服務、後台管理系統和定時監控組成,手機安卓端開發語言採用:java、 IOS 蘋果採用:object c 原生開發,後台管理採用PHP 語言開發,所有服務提供橫向擴展。
二、功能細節:
1、推薦:通過後台推薦+視頻權重的方式為用戶推薦相關視頻,並在首頁直接觀看,同事直接進行關注坐著、評論、點贊以及分享;
2、搜索:
1)根據用戶:可輸入用戶昵稱來搜索用戶,支持模糊查詢,對搜索出的用戶可進行關注;
2)分類:對應相應的不同分類
3)視頻:可輸入視頻名稱來進行搜索;
3、視頻觀看
1)分享:可分享到微信、朋友圈等社交平台;
2)點贊:對喜歡的視頻進行點贊,表示喜歡和認可;
3)評論:可對短視頻進行評論,對於評論可再次回復;
4、關注
展示當前用戶關注的人發的短視頻列表
5、消息
1)我發表的評論以及發表的評論回復的
2)我收到的評論,後期對我發布短視頻的評論,可以添加用戶發布短視頻的時候添加
2、系統消息:平台可以發布平台公告
6、個人中心
1)用戶資料:展示自己的頭像昵稱等,並可對資料進行修改
2)關註:關注的數量顯示,點擊關注跳轉到關注列表頁面,並可對自己的關注的人取消關注
3、點贊列表:查看自己點贊過的視頻
⑵ Android廣播阻塞、延遲問題
最近項目中,多次碰到app研發人員反饋廣播從發送到接收器接收,間隔時間太長,要求系統進行優化,特別是開機階段。對此,專門閱讀了一下廣播從發送到接收這個流程的源碼,以徹底搞明白怎樣讓自己發送的廣播盡快到達接收器。
涉及到的源碼類不多,主要就是ActivityManagerService.java 和 BroadcastQueue.java。發送廣播進程調用發送介面,通過IPC到達AMS,AMS根據Intent是否配置Intent.FLAG_RECEIVER_FOREGROUND,選擇當前廣播加入前台廣播隊列還是後台廣播隊列。根據當前廣播是否有序,將廣播加入廣播隊列的串列列表還是並行列表。廣播隊列和廣播隊列中的廣播列表是影響廣播接收時間的主要因素。
BroadcastQueue廣播隊列,負責將廣播發送給廣播接收器。AMS中有兩個成員變數,
BroadcastQueue mFgBroadcastQueue;//前台廣播隊列
BroadcastQueue mBgBroadcastQueue;//後台廣播隊列
前台廣播隊列和後台廣播隊列的區別有兩處:1 超時時間,前台10s,後台60s. 2 是否延遲廣播等待前一個廣播進程完成。這兩個區別已經說明前台廣播對廣播接收器要求更高,響應時間更短,如果廣播要排隊,時間上前台廣播更短。同時系統默認使用後台廣播隊列,所以前台廣播隊列處理的廣播要少,避免了可能的大量廣播排隊情況。
廣播隊列中的列表
//存放無序並發送給動態廣播接收器的廣播任務
final ArrayList<BroadcastRecord> mParallelBroadcasts = new ArrayList<BroadcastRecord>();
//存放無序發送給靜態廣播接收器的廣播任務或者存放有序廣播任務
final ArrayList<BroadcastRecord> mOrderedBroadcasts = new ArrayList<BroadcastRecord>();
mParallelBroadcasts 此列表中存放的是無序廣播動態廣播接收器任務,廣播隊列會在處理任務時通過嵌套循環,把每個廣播通過ipc發送到關注它的所有進程。所有無序廣播+動態廣播接收器,廣播不需要排隊。這種情況是最快能讓廣播到達目標進程的方式。
mOrderedBroadcasts存放的廣播任務特點:廣播有序,或者廣播接收器是靜態注冊的。此種類型的廣播全部要在mOrderedBroadcasts中排隊,廣播之間按時間先後,同一個廣播不同廣播接收器按優先順序。mOrderedBroadcasts存放的廣播必須等一個廣播任務處理完畢才能處理下一個,中間可能包含進程的啟動等。
由此可見,廣播最快的情況是前台廣播、無序廣播、動態注冊廣播接收器。最糟糕的情況是:後台廣播、有序或靜態注冊廣播接收器、廣播接收器優先順序低。如果一個應用只是簡單的靠注冊一個靜態廣播接收器拉起進程,對應的正是最糟糕的情況。如果又發生在開機階段,自然延遲嚴重。
如果必須注冊靜態廣播接收器,縮短時間的辦法為:配置Intent.FLAG_RECEIVER_FOREGROUND,加入前台廣播隊列,設置廣播優先順序
源碼:
廣播發送:Context .sendBroadcast ->ActivityManagerNative.broadcastIntent->ActivityManagerService.broadcastIntent->ActivityManagerService.broadcastIntentLocked.到此階段,跟發送廣播的進程通信結束。此階段AMS完成的工作主要是根據Intent查找該廣播對應的動態廣播接收器、靜態廣播接收器、以此發送該廣播使用的廣播隊列。
private final int broadcastIntentLocked(
......//許可權檢查
......//特殊系統廣播進行必要處理
if (sticky) {//粘性廣播處理
......
//查找靜態注冊的接收器
receivers = collectReceiverComponents(intent, resolvedType, users);
if (intent.getComponent() == null) {
// 查找動態廣播接收器
registeredReceivers = mReceiverResolver.queryIntent(intent,
resolvedType, false, userId);
}
//動態廣播接收器
int NR = registeredReceivers != null ? registeredReceivers.size() : 0;
if (!ordered && NR > 0) {
//確定隊列
final BroadcastQueue queue = broadcastQueueForIntent(intent);
//創建廣播任務BroadcastRecord
BroadcastRecord r = new BroadcastRecord(queue, intent, callerApp,
callerPackage, callingPid, callingUid, resolvedType, requiredPermission,
appOp, registeredReceivers, resultTo, resultCode, resultData, map,
ordered, sticky, false, userId);
......
//廣播任務加入並行列表中
queue.(r);
//啟動非同步發送廣播任務
queue.scheleBroadcastsLocked();
registeredReceivers = null;
NR = 0;
......
while (it < NT && ir < NR) {
......
//根據優先順序排序
if (curt == null) {
curt = (ResolveInfo)receivers.get(it);
}
if (curr == null) {
curr = registeredReceivers.get(ir);
}
if (curr.getPriority() >= curt.priority) {
// Insert this broadcast record into the final list.
receivers.add(it, curr);
//獲取廣播隊列
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);
//加入到廣播隊列串列列表中
queue.enqueueOrderedBroadcastLocked(r);
//啟動非同步發送任務
queue.scheleBroadcastsLocked();
廣播隊列處理廣播:
final void processNextBroadcast(boolean fromMsg) {
......
//並行列表,遍歷廣播任務
while (mParallelBroadcasts.size() > 0) {
final int N = r.receivers.size();
//遍歷接收器
for (int i=0; i<N; i++) {
//IPC調用發送給目標進程
(r, (BroadcastFilter)target, false);
}
}
//有串列廣播任務正在執行
if (mPendingBroadcast != null) {
//接收廣播的目標進程正常
if (!isDead) {
// It's still alive, so keep waiting 繼續等待目前進程反饋
return;
}
}
//取出第一個廣播
r = mOrderedBroadcasts.get(0);//判斷是否超時,
if ((numReceivers > 0) &&
(now > r.dispatchTime + (2*mTimeoutPeriod*numReceivers))) {
//廣播超時
broadcastTimeoutLocked(false);//超時處理,終止當前廣播,啟動下一個任務。
}
if (r.receivers == null || r.nextReceiver >= numReceivers
|| r.resultAbort || forceReceive) {
//所有廣播任務執行完畢
}
int recIdx = r.nextReceiver++;//下一個廣播接收器
r.dispatchTime = r.receiverTime;//設置派發時間
setBroadcastTimeoutLocked(timeoutTime);//啟動超時計時
if (nextReceiver instanceof BroadcastFilter){//動態廣播接收器
(r, filter, r.ordered);//發送
return;
}
.//靜態廣播
ResolveInfo info =
(ResolveInfo)nextReceiver;
......
//檢查進程是否已啟動
ProcessRecord app = mService.getProcessRecordLocked(targetProcess,
info.activityInfo.applicationInfo.uid, false);
if (app != null && app.thread != null) { /進程啟動
processCurBroadcastLocked(r, app);//發送靜態廣播
return;
}
if ((r.curApp=mService.startProcessLocked(targetProcess,//啟動進程
info.activityInfo.applicationInfo, true,
r.intent.getFlags() | Intent.FLAG_FROM_BACKGROUND,
"broadcast", r.curComponent,
(r.intent.getFlags()&Intent.FLAG_RECEIVER_BOOT_UPGRADE) != 0, false, false))
== null) {
//進程啟動失敗
}
//標志正在發送的串列廣播
mPendingBroadcast = r;
mPendingBroadcastRecvIndex = recIdx;//正在發送的廣播任務對應的接收器索引
}
⑶ android 開發中如何實現讓程序執行一條語句後延時一段時間後再執行下面的語句
你這方法完全是利用了單片機處理速度慢才會有偽延時效果,實際上那時機器正在運算,放在好點的機器上運算速度快了當然就沒延時效果了。正統的延時還是要用到樓上說的線程,安卓還有一個timer類也可以用於定時。
⑷ 如何在Android Studio中使用LeakCanary檢測內存泄露
內存泄露檢測是項目性能優化不可避免的問題,只有解決內存泄露問題才能從根本上解決OOM。在Eclipse中提供Mat工具來檢測內存泄露,但是使用較為麻煩,界面也不是很直觀。對於有耐心,有想法的,也是可以嘗試了解一下。知道Leak的出現,為內存泄露檢測帶來了福音。
1.什麼是LeakCanary
LeakCanary
A memory leak detection library for Android and Java.
LeakCanary是一個Android和Java的內存檢測庫。
2.LeakCanary如何展示內存泄露信息
如果項目存在內存泄露,就會在狀態欄或是一個單獨的Leaks程序中顯示內存泄露信息,提供一個造成內存泄露對象的引用路徑
【錯誤2】:但是有的人沒有相應的圖標,怎麼辦?
因為gradle設置錯誤的原因,上述build分別設置了debugCompile 和 releaseCompile,具體的區別這里不細說了,需要有一定的gradle功底,才能改修完成。這里給出的最簡易的方案,適用於該產品在加入的leakCancy僅僅在測試的時候使用,而在release包中手動去除相應的代碼:【解決當前問題,但是不提倡】
1、debug 和 release 引用相同的lib
dependencies {
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5'
releaseCompile 'com.squareup.leakcanary:leakcanary-android:1.5'
}
2、使用compile 不再1區分debug 和 release12
dependencies {
compile 'com.squareup.leakcanary:leakcanary-android:1.5'
}
如果存在內存泄露,將會顯示內存泄露的對象的引用路徑。
⑸ java代碼怎麼控制android休眠和喚醒
喚醒:android.intent.action.SCREEN_ON (代碼)
休眠:android.intent.action.SCREEN_OFF (代碼)
android系統一段時間沒有操作,
屏幕(screen)將從高亮(bright)變為暗淡(dim),如果再過段時間還是沒有操作,屏幕(screen)從暗淡(dim)變為關閉(off).這時,系統將進入休眠.
而對於某些需要保持系統喚醒甚至屏幕喚醒的應用(比如視頻播放器和音樂播放器)來說,就必須要有一個機制,使得系統不進入休眠狀態,設置保持屏幕亮屏狀態.
wakelock即用來實現以上目的
接下來對每一個模塊具體分析:
powermanager
對應文件是android/frameworks/base/core/java/android/os/PowerManager.java
在Android中應用程序並不是直接同PowerManagerService交互的,而是通過PowerManager間接地與PowerManagerService打交道。
此文件定義了一個powermanager類.
主要實現了
1,wakelock的申請與釋放
public WakeLock newWakeLock(int flags, String tag)
2,系統延時進入休眠
public void userActivity(long when, boolean noChangeLights)
3,系統強制休眠
public void goToSleep(long time)
4,屏幕亮度設置
public void setBacklightBrightness(int brightness)
5,屏幕狀態查詢
public boolean isScreenOn()
6,系統重啟
public void reboot(String reason)
細節
wakelock的申請與釋放
{@samplecode
*PowerManager pm = (PowerManager)mContext.getSystemService(
* Context.POWER_SERVICE);
*PowerManager.WakeLock wl = pm.newWakeLock(
* PowerManager.SCREEN_DIM_WAKE_LOCK
* | PowerManager.ON_AFTER_RELEASE,
* TAG);
*wl.acquire();
* // ...
*wl.release();
一共有如下幾個flag來進行不一樣的喚醒方式.可以根據需要設置
Flag Value CPU Screen Keyboard
PARTIAL_WAKE_LOCK On* can-off Off
SCREEN_DIM_WAKE_LOCK On Dim Off
PROXIMITY_SCREEN_OFF_WAKE_LOCK on 距離感測器時關閉 off
SCREEN_BRIGHT_WAKE_LOCK On Bright Off
FULL_WAKE_LOCK On Bright Bright
ACQUIRE_CAUSES_WAKEUP 確保wakelock,主要用於視頻播放器
ON_AFTER_RELEASE = 0x20000000 release後倒計時,關閉屏幕
...
userActivity的作用:
使系統從其他狀態進入全部打開狀態,比如從暗屏(dim)切換到亮屏,並重置倒計時計數器
⑹ android開發框架有哪些
1、Rajawali
介紹:
安卓的OpenGL ES 2.0/3.0 引擎。可以用於製作普通應用或者動態壁紙,當然也可以用於製作游戲。
項目地址: https://github.com/Rajawali/Rajawali
2、RxAndroid
介紹:
RxAndroid是RxJava的一個針對Android平台的擴展。它包含了一些能夠簡化Android開發的工具。
項目地址: https://github.com/ReactiveX/RxAndroid
3、Paginize
介紹:
Paginize 是一個輕量級的UI框架,使用註解來注入布局和view,除了使用註解之外,該框架還有兩個特色:1.用Page的概念來取代Fragment,2.切換page時自帶ios風格的動畫效果。
項目地址: https://github.com/neevek/Paginize
4、otto
介紹:
Otto 是square公司出的一個事件庫(pub/sub模式),用來簡化應用程序組件之間的通訊。 Otto 修改自Google的Guava庫,專門為Android平台進行了優化。
項目地址: https://github.com/square/otto
5 、rebound
介紹:
rebound是facebook的開源動畫庫。可以認為這個動畫庫是獨立於android Framework之外的一種動畫實現。
項目地址: https://github.com/facebook/rebound
6、KJFrameForAndroid
介紹:
KJFrameForAndroid 又叫KJLibrary,是一個幫助快速開發的框架。使用KJFrameForAndroid,你可以只用一行代碼就完成http請求、網路圖片載入、資料庫數據保存或讀取。
項目地址: https://github.com/kymjs/KJFrameForAndroid
7、xUtils
介紹:
xUtils
包含了很多實用的android工具。 xUtils
支持大文件上傳,更全面的http請求協議支持(10種謂詞),擁有更加靈活的ORM,更多的事件註解支持且不受混淆影響... xUitls
最低兼容android 2.2 (api level 8)
項目地址: https://github.com/wyouflf/xUtils
目前xUtils主要有四大模塊:
DbUtils模塊:
android中的orm框架,一行代碼就可以進行增刪改查;
支持事務,默認關閉;
可通過註解自定義表名,列名,外鍵,唯一性約束,NOT NULL約束,CHECK約束等(需要混淆的時候請註解表名和列名);
支持綁定外鍵,保存實體時外鍵關聯實體自動保存或更新;
自動載入外鍵關聯實體,支持延時載入;
支持鏈式表達查詢,更直觀的查詢語義,參考下面的介紹或sample中的例子。
ViewUtils模塊:
android中的ioc框架,完全註解方式就可以進行UI,資源和事件綁定;
新的事件綁定方式,使用混淆工具混淆後仍可正常工作;
目前支持常用的20種事件綁定,參見ViewCommonEventListener類和包com.lidroid.xutils.view.annotation.event。
HttpUtils模塊:
支持同步,非同步方式的請求;
支持大文件上傳,上傳大文件不會oom;
支持GET,POST,PUT,MOVE,COPY,DELETE,HEAD,OPTIONS,TRACE,CONNECT請求;
下載支持301/302重定向,支持設置是否根據Content-Disposition重命名下載的文件;
返迴文本內容的請求(默認只啟用了GET請求)支持緩存,可設置默認過期時間和針對當前請求的過期時間。
BitmapUtils模塊:
載入bitmap的時候無需考慮bitmap載入過程中出現的oom和android容器快速滑動時候出現的圖片錯位等現象;
支持載入網路圖片和本地圖片;
內存管理使用lru演算法,更好的管理bitmap內存;
可配置線程載入線程數量,緩存大小,緩存路徑,載入顯示動畫等...
8、butterknife-view
注入工具
介紹:
為了減少頻繁的調用findViewById(R.id...),可以採用一些注入框架,可以簡化自己的代碼,讓你更專注於實際的功能開發,butterknife就是這樣的一個框架,他是jakewharton大神的作品,值得一試。
class ExampleActivity extends Activity {
@InjectView(R.id.title) TextView title;
@InjectView(R.id.subtitle) TextView subtitle;
@InjectView(R.id.footer) TextView footer;
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.simple_activity);
ButterKnife.inject(this);
// TODO Use "injected" views...
}
}
這是博客地址:
http://jakewharton.github.io/butterknife/
項目地址: https://github.com/JakeWharton/butterknife
9、cube-sdk
一淘推出的開發框架
介紹:
cube一個Android開發包, 可極大提高你的開發效率。主要提供了圖片載入以及網路請求方面的api功能。
項目地址: https://github.com/etao-open-source/cube-sdk
他們的網站:http://cube-sdk.liaohuqiu.net/cn/
10、ASimpleCache
一個簡單的緩存框架
介紹:
ASimpleCache
是一個為android制定的 輕量級的 開源緩存框架。輕量到只有一個java文件(由十幾個類精簡而來)。
它可以緩存什麼東西?普通的字元串、JsonObject、JsonArray、Bitmap、Drawable、序列化的java對象,和
byte數據。
項目地址: https://github.com/yangfuhai/ASimpleCache
11、androidannotations
介紹:
AndroidAnnotations是一個能夠讓你快速進行Android開發的開源框架,它能讓你專注於真正重要的地方。
使代碼更加精簡,使項目更加容易維護,它的目標就是「Fast Android Development.Easy maintainance」。
通過一段時間的使用發現,相比原生的Android開發,確實能夠讓你少些很多代碼
項目地址: https://github.com/excilys/androidannotations
12、Event Bus
解耦android模塊
介紹:
當一個Android應用功能越來越多的時候,保證應用的各個部分之間高效的通信將變得越來越困難。如何優雅地解決這個問題?這時候,就需要使用到EventBus。
EventBus是GreenRobot出品的Android系統的一個Event
Bus類庫,使用起來和之前我們所介紹的Square的Otto差不多,都是用來簡化應用組件之間的通信。
項目地址: https://github.com/greenrobot/EventBus
13、BeeFramework_Android
介紹:
BeeFramework
Android版主要為Android初級開發人員提供一個基於MVC開發模式的APP DEMO,並提供一套APP內調試工具,包括
查看網路數據請求歷史 Crash Log列表 真機WIFI環境下模擬2G\3G網路 查看APP性能(內存佔用,CPU佔用等)
項目地址: https://github.com/BeeFramework/BeeFramework_Android
14、afinal
介紹:
Afinal是一個android的ioc,orm框架,內置了四大模塊功能:FinalAcitivity,FinalBitmap,FinalDb,FinalHttp。通過finalActivity,我們可以通過註解的方式進行綁定ui和事件。通過finalBitmap,我們可以方便的載入bitmap圖片,而無需考慮oom等問題。通過finalDB模塊,我們一行代碼就可以對android的sqlite資料庫進行增刪改查。通過FinalHttp模塊,我們可以以ajax形式請求http數據。
Afinal裡面目前包含了四大組件:
FinalHttp:用於請求http數據,直接ajax方式請求,文件上傳, 斷點續傳下載文件等
FinalBitmap:用於顯示bitmap圖片,而無需考慮線程並發和oom等問題。
FinalActivity:完全可以通過註解方式綁定控制項和事件,無需編寫代碼。
FinalDb:android中sqlite的orm框架,一行代碼搞定增刪改查。
Afinal是一個android的ioc,orm框架,內置了四大模塊功能:FinalAcitivity,FinalBitmap,FinalDb,FinalHttp。通過finalActivity,我們可以通過註解的方式進行綁定ui和事件。通過finalBitmap,我們可以方便的載入bitmap圖片,而無需考慮oom等問題。通過finalDB模塊,我們一行代碼就可以對android的sqlite資料庫進行增刪改查。通過FinalHttp模塊,我們可以以ajax形式請求http數據。詳情請通過以下網址查看。
項目地址: https://github.com/yangfuhai/afinal
15、Volley
介紹:
在這之前,我們在程序中需要和網路通信的時候,大體使用的東西莫過於AsyncTaskLoader,HttpURLConnection,AsyncTask,HTTPClient(Apache)等,今年的Google
I/O 2013上,Volley發布了。Volley是Android平台上的網路通信庫,能使網路通信更快,更簡單,更健壯。
項目地址: https://github.com/mcxiaoke/android-volley
⑺ android 延時廣播 廣播延時怎麼解決
簡單智誘滋事迫兆
⑻ JAVA 安卓開發中 如何實現語句間延遲執行
多線程操作,如
運行後的界面,繼承線程類,或繼承AsyncTask
在類的任務擴展AsyncTask
保護無效的doInBackground(VOID ...參數){
調用Thread.sleep(1000);
}
保護無效onPostExecute(虛空結果){
result.setText(str.toString()); BR />
}
}
主線程「新」的任務()()內的;