需要在資源文件中添加一個(gè)button,然后如果你需要給這個(gè)button增加點(diǎn)擊事件,那你就需要在代碼中找到這個(gè)button,給它添加點(diǎn)擊事件監(jiān)聽,在監(jiān)聽中響應(yīng)你所需要的完成的操作。

十年的閬中網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。全網(wǎng)營銷推廣的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整閬中建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“閬中網(wǎng)站設(shè)計(jì)”,“閬中網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
Android系統(tǒng)手機(jī)添加桌面圖標(biāo)可以進(jìn)入菜單界面找到想要建立桌面快捷方式的程序,按住圖標(biāo)不放,感到一下震動(dòng)之后,圖標(biāo)即可移動(dòng),然后把圖標(biāo)拖動(dòng)到您想要擺放的位置就可以松手了(注意操作期間要按定圖標(biāo)不要放)。(上述內(nèi)容僅適用于廣東聯(lián)通用戶)
在AndroidManifest中添加android:name
新建android:name對(duì)應(yīng)的class,并定義public方法繼承Application
在android中添加系統(tǒng)服務(wù),下面以SurfaceComposer這個(gè)service為例,
① 首先提供接口文件ISurfaceComposer.h
//frameworks\native\include\gui\ISurfaceComposer.h
//首先是接口,c++實(shí)現(xiàn)是虛函數(shù)
class ISurfaceComposer: public IInterface {
public:
DECLARE_META_INTERFACE(SurfaceComposer);
// flags for setTransactionState()
enum {
eSynchronous = 0x01,
eAnimation = 0x02,
};
enum {
eDisplayIdMain = 0,
};
/* create connection with surface flinger, requires
* ACCESS_SURFACE_FLINGER permission
*/
virtual spISurfaceComposerClient createConnection() = 0;
}
② 建立BnSurfaceComposer
建立BnSurfaceComposer,需要重寫B(tài)Binder的onTransact函數(shù)。
class BnSurfaceComposer: public BnInterfaceISurfaceComposer {
public:
enum {
// Note: BOOT_FINISHED must remain this value, it is called from
// Java by ActivityManagerService.
BOOT_FINISHED = IBinder::FIRST_CALL_TRANSACTION,
CREATE_CONNECTION,
CREATE_GRAPHIC_BUFFER_ALLOC,
CREATE_DISPLAY_EVENT_CONNECTION,
CREATE_DISPLAY,
DESTROY_DISPLAY,
GET_BUILT_IN_DISPLAY,
SET_TRANSACTION_STATE,
AUTHENTICATE_SURFACE,
BLANK,
UNBLANK,
GET_DISPLAY_INFO,
CONNECT_DISPLAY,
CAPTURE_SCREEN,
};
virtual status_t onTransact(uint32_t code, const Parcel data,
Parcel* reply, uint32_t flags = 0);
};
③ Bpxxx的實(shí)現(xiàn)
frameworks\native\libs\gui\ISurfaceComposer.cpp中,
//Bp實(shí)現(xiàn),代理端
class BpSurfaceComposer : public BpInterfaceISurfaceComposer
{
public:
BpSurfaceComposer(const spIBinder impl)
: BpInterfaceISurfaceComposer(impl)
{
}
//代理接口
virtual spISurfaceComposerClient createConnection()
{
uint32_t n;
Parcel data, reply;
data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
remote()-transact(BnSurfaceComposer::CREATE_CONNECTION, data, reply);
return interface_castISurfaceComposerClient(reply.readStrongBinder());
}
}
④ Bnxxx的實(shí)現(xiàn)
//Bn端,即server端
status_t BnSurfaceComposer::onTransact(
uint32_t code, const Parcel data, Parcel* reply, uint32_t flags)
{
switch(code) {
case CREATE_CONNECTION: {
CHECK_INTERFACE(ISurfaceComposer, data, reply);
//createConnection就是server端的實(shí)現(xiàn)函數(shù)
spIBinder b = createConnection()-asBinder();
reply-writeStrongBinder(b);
return NO_ERROR;
}
default: {
return BBinder::onTransact(code, data, reply, flags);
}
}
// should be unreachable
return NO_ERROR;
}
⑤ 注冊(cè)service
通過上面幾步已經(jīng)完成了service的建立,我們需要將service注冊(cè)到service manager中。
class SurfaceFlinger : public BnSurfaceComposer,
//在frameworks\native\services\surfaceflinger\main_surfaceflinger.cpp中,
// publish surface flinger
spIServiceManager sm(defaultServiceManager());
sm-addService(String16(SurfaceFlinger::getServiceName()), flinger, false);
⑥ 使用service
//首先獲取代理端BpSurfaceComposer
spISurfaceComposer composer(ComposerService::getComposerService());
//直接調(diào)用代理BpSurfaceComposer的接口
spIGraphicBufferAlloc alloc(composer-createGraphicBufferAlloc());
其中g(shù)etComposerService()的實(shí)現(xiàn)為,
/*static*/ spISurfaceComposer ComposerService::getComposerService() {
ComposerService instance = ComposerService::getInstance();
Mutex::Autolock _l(instance.mLock);
if (instance.mComposerService == NULL) {
ComposerService::getInstance().connectLocked();
assert(instance.mComposerService != NULL);
ALOGD("ComposerService reconnected");
}
return instance.mComposerService;
}
void ComposerService::connectLocked() {
const String16 name("SurfaceFlinger");
//獲取service,返回的mComposerService是BpSurfaceComposer,有了Bp就能直接調(diào)用代理接口了
while (getService(name, mComposerService) != NO_ERROR) {
usleep(250000);
}
assert(mComposerService != NULL);
// Create the death listener.
class DeathObserver : public IBinder::DeathRecipient {
ComposerService mComposerService;
virtual void binderDied(const wpIBinder who) {
ALOGW("ComposerService remote (surfaceflinger) died [%p]",
who.unsafe_get());
mComposerService.composerServiceDied();
}
public:
DeathObserver(ComposerService mgr) : mComposerService(mgr) { }
};
mDeathObserver = new DeathObserver(*const_castComposerService*(this));
mComposerService-asBinder()-linkToDeath(mDeathObserver);
}
java添加service
Android為了方便開發(fā)人員,提供了AIDL工具,簡(jiǎn)化了編寫service的難度。下面以添加TestService這個(gè)服務(wù)為例,
① 編寫AIDL文件
package android.app;
interface ITestService {
boolean enableWifi(boolean enabled);
}
TestService的AIDL文件提供了一個(gè)接口,enableWifi()。
② 創(chuàng)建TestService服務(wù)
TestService 服務(wù)需要繼承ITestService.Stub類,這個(gè)類就是通過AIDL工具對(duì)①中的AIDL文件處理后產(chǎn)生的,
class TestService extends ITestService.Stub {
//實(shí)現(xiàn)接口
public boolean enableWifi(boolean enabled)
{
......
}
}
③ Context.java中添加service名字字符串
// Context.java中添加service名字字符串
public static final String TEST_SERVICE = "my_test";
④ 向ServiceManager中注冊(cè)service
java中大部分的系統(tǒng)service都是在SystemServer中去向service manager注冊(cè)的,
//ServiceManager注冊(cè)service
// 在SystemServer.java中,模仿其他向ServiceManager添加service的方法
try {
TestService myService = new TestService(context);
ServiceManager.addService(Context.TEST_SERVICE, myService);
} catch (Throwable e) {
reportWtf("register my test service fail", e);
}
⑤創(chuàng)建服務(wù)對(duì)應(yīng)的Manager
對(duì)于每一個(gè)service而言,通常會(huì)有一個(gè)相關(guān)的Manager。 Managers提供API給app使用,成為SDK的一部分,是apps和remote service的中間橋梁。Manager中的接口和Service中的接口必須一一對(duì)應(yīng)。
public class TestServiceManager{
private final ITestService mService;
private final Context mContext;
//構(gòu)造函數(shù)中傳入的service,其實(shí)就是BpTestService
TestServiceManager(Context context,ITestService service) {
mContext = context;
mService = service;
}
public boolean enableWifi(boolean enabled) {
try {
return mService.enableWifi(enabled);
} catch (RemoteException ex) {
}
return false;
}
}
到目前為止,我們只是完成了Service的注冊(cè),但是還沒有使用,該如何使用?
⑥ contextImpl中注冊(cè)Manager
一旦我們實(shí)現(xiàn)了service和對(duì)應(yīng)的Manager,需要有一種方法在app中調(diào)用他們。前面說過,Manager會(huì)成為SDK的一部分,供我們調(diào)用,那么Manager和Service是如何聯(lián)系起來的?首先需要將我們的service和mangager注冊(cè)到execution context,即contextImpl中,
registerService(TEST_SERVICE, new ServiceFetcher() {
public Object createService(ContextImpl ctx) {
IBinder b = ServiceManager.getService(TEST_SERVICE);
//asInterface(BpBinder)后就是BpTestService
ITestService service = ITestService.Stub.asInterface(b);
//創(chuàng)建TestServiceManager,第二個(gè)參數(shù)為BpBpTestService
return new TestServiceManager(ctx.getOuterContext(), service);
}});
registerService的第二個(gè)參數(shù)是一個(gè)ServiceFetcher對(duì)象,這里直接在調(diào)用時(shí),新建了一個(gè)ServiceFetcher類,重寫了createService方法。
ContextImpl.java中的registerService()方法,其核心就是把servicename和ServiceFetcher對(duì)象放到一個(gè)Hash的鍵值對(duì)中。
private static void registerService(String serviceName, ServiceFetcher fetcher) {
if (!(fetcher instanceof StaticServiceFetcher)) {
fetcher.mContextCacheIndex = sNextPerContextServiceCacheIndex++;
}
SYSTEM_SERVICE_MAP.put(serviceName, fetcher);
}
⑦ app如何使用service
那么app是如何調(diào)用的呢?
import android.app.TestServiceManager;
import android.content.Context;
TestServiceManager mTestServiceManager;
mTestServiceManager=(TestServiceManager)context.getSystemService(Context.TEST_SERVICE);
然后直接調(diào)用TestServiceManager中的方法即可,其中的奧秘需要分析下getSystemService函數(shù)。
ContextImpl.java中,
@Override
public Object getSystemService(String name) {
ServiceFetcher fetcher = SYSTEM_SERVICE_MAP.get(name);
//從ServiceFetcher 中獲取service
return fetcher == null ? null : fetcher.getService(this);
}
getService()函數(shù)的核心就是上面重寫的createService()函數(shù),返回的就是TestServiceManager對(duì)象,所以通過context.getSystemService返回的是Manager對(duì)象。
public Object getService(ContextImpl ctx) {
ArrayListObject cache = ctx.mServiceCache;
Object service;
synchronized (cache) {
if (cache.size() == 0) {
// Initialize the cache vector on first access.
// At this point sNextPerContextServiceCacheIndex
// is the number of potential services that are
// cached per-Context.
for (int i = 0; i sNextPerContextServiceCacheIndex; i++) {
cache.add(null);
}
} else {
service = cache.get(mContextCacheIndex);
if (service != null) {
return service;
}
}
//調(diào)用重載的createService函數(shù),返回的就是TestServiceManager對(duì)象
service = createService(ctx);
cache.set(mContextCacheIndex, service);
return service;
}
}
這幾天突然要發(fā)一個(gè)中國臺(tái)灣版本,做法比較硬:復(fù)制一個(gè)工程,改包名,改圖標(biāo),改api接口。語言全部都是繁體就行:
Android studio添加新語言資源文件(res/values/....)如下:
然后回車即可:
把對(duì)應(yīng)的字符串翻譯成繁體就行。至于翻譯,有一些工具可以借鑒。同時(shí)網(wǎng)上也有很多多語言切換的方式,就是一個(gè)工程,一個(gè)app進(jìn)行內(nèi)部切換多語言支持的方式(像微信就是。不過微信繁體有些不一定都支持了...)。具體看情況啦。。。
因?yàn)槲覀兪钦麄€(gè)app就是中國臺(tái)灣臺(tái)北版本,所以就都是繁體,不管系統(tǒng)是簡(jiǎn)體還是繁體還是別的,就是繁體!!!
簡(jiǎn)單記錄下。好多東西沒怎么關(guān)注或者使用,至于是否要深入,可能要看情況....
參考o(jì): android--實(shí)現(xiàn)多語言支持 - snow_flower - 博客園
如您需要在Android系統(tǒng)手機(jī)上添加聯(lián)系人請(qǐng)進(jìn)入“聯(lián)系人”——“MENU”——“導(dǎo)入聯(lián)人”——“MENU——“全部導(dǎo)入”——Device 就把所有SIM上聯(lián)系人導(dǎo)入到設(shè)備上了。(上述內(nèi)容僅適用于廣東聯(lián)通用戶)
當(dāng)前名稱:android添加,android添加圖片資源
網(wǎng)頁鏈接:http://chinadenli.net/article10/dsijjgo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、營銷型網(wǎng)站建設(shè)、網(wǎng)站收錄、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、Google
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)