关闭

Android_Notes

702人阅读 评论(0) 收藏 举报

    private static final int REQUEST_EXTERNAL_STORAGE = 1;
    private static String[] PERMISSIONS_STORAGE = {
           Manifest.permission.READ_EXTERNAL_STORAGE,
          Manifest.permission.WRITE_EXTERNAL_STORAGE };

  public static void verifyStoragePermissions(Activity activity) {
      // Check if we have write permission
        int permission = ActivityCompat.checkSelfPermission(activity,
               Manifest.permission.WRITE_EXTERNAL_STORAGE);

       if (permission != PackageManager.PERMISSION_GRANTED) {
           // We don't have permission so prompt the user
           ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE,
                  REQUEST_EXTERNAL_STORAGE);
       }
    }



联网APP:
1.请求后端数据,解析数据进行UI更新
2.响应用户操作,再次请求数据,更新UI

OkHttp
compile 'com.squareup.okhttp3:okhttp:3.4.1'
compile 'com.squareup.okio:okio:1.10.0'

1.get
        OkHttpClient mOkHttpClient = new OkHttpClient();
        //get
        Request request = new Request.Builder().url("https://www.baidu.com/").build();

        Call call = mOkHttpClient.newCall(request);

        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.e("yqflog", "####e####" + e);
            }

            @Override
            public void onResponse(Call call, okhttp3.Response response) throws IOException {
                Log.e("yqflog", "####response####" + response);
                Log.e("yqflog", "####body####" + response.body().string());
                response.close();
            }
        });
        
        

Volley
compile 'com.mcxiaoke.volley:library:1.0.17'

1. 创建一个RequestQueue对象。
RequestQueue mQueue = Volley.newRequestQueue(context);  
2. 创建一个Request对象。--- 网络请求的对象
3. 将Request对象添加到RequestQueue里面。

HttpClient
1)创建 HttpClient 对象
2)创建 post 对象
3)获取参数,将参数传入 post 对象
4)HttpClient 将携带参数的 post 发送给服务器
5)获取服务器响应


compatible
kəmˈpætəbl
adj.
可以并存的, 相容的, 协调的

restriction
rɪˈstrɪkʃən
n.
约束, 限制;管制, 限定;法律, 规章

constitute
ˈkɔnstitju:t
vt.
构成, 组成;建立, 制定;选定, 任命


Linux 启动时,第一个运行的进程是 INIT;

在Android中,第一个启动的 虚拟机 是 zygote ,zygote 由两部分组成
1)socket服务端
2)frameworks 共享类和资源
zygote 启动的第一个进程是 SystemService(由3个主要线程 AMS WMS PMS),
SystemService 会创建 socket客户端 ,AMS 命令通过 socket客户端 发送 到 socket服务端,
zygote 接收到命令 孵化出新的应用


startService()  or bindService() 启动service的生命周期不同 !!!

//判断是否在锁屏界面
    KeyguardManager mKeyguardManager = (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE);
    boolean isKeyGuard = mKeyguardManager.inKeyguardRestrictedInputMode();

//电脑重启不能使用,清空Trash
/root/.local/share/Trash


01-01 00:19:28.892  6929  6929 E AndroidRuntime: java.lang.SecurityException: Not allowed to bind to service Intent { cmp=com.yue.mymessenger/.MyService }
//AndroidManifest.xml 中给对应service添加 android:exported="true"

// Activity or Service 在  AndroidManifest.xml 中添加 android:process=":remote"  其组件就为另一个进程
//:表示为私有进程, 没有: 为全局进程,其他应用可以通过SharedUID的方式和它跑在同一个进程


//surfaceflinger 绘制UI

//FPS  frames per second

//FPC flexible printed circuit  柔性电路板

//PCB printed circuit board 印制电路板

//EOF end of file 资料源无更多的资料可读取


//java DAO  数据库相关类


View 是 Android 所有控件的 基类 ,  

1. View 的 位置参数
top left right bottom

2. MotionEvent & TouchSlop

ACTION_DOWN 手指刚接触屏幕

ACTION_MOVE  手指在屏幕上移动

ACTION_UP         手指刚离开屏幕    

TouchSlop 是系统所能识别的出被认为是滑动的最小距离,

3. VelocityTracker GestureDetector Scroller

 VelocityTracker 速度追踪
 
 GestureDetector 滑动 单击 双击 长按
 
 Scroller 弹性滑动对象,用于视线 View 的弹性滑动
 
 // View 事件分发机制
 
 dispatchTouchEvent
 
 onInterceptTouchEvent
 
 onTouchEvent
 
 // 理解 Window 和 WindowManager
  !!!
 
//IPC          服务器  客户端

1. Bundle    Activity Service Receiver

2. 文件共享

3.Messenger    对 AIDL 进行了封装


//Android 的消息机制 -- 异步消息处理机制

线程默认是没有 Looper ,如果需要使用 Handler 就必须为线程创建 Looper
主线程 为 ActivityThread , 创建时就会初始化 Looper , 只有主线程才能更新UI

子线程为什么不能更新UI?
android的UI控件不是安全的, 如果多线程并发访问可能会导致UI控件处于不可预期的状态

为什么不加上锁机制?
缺点:
1.会导致UI访问的逻辑变的更加复杂
2.锁机制会降低UI访问的效率,因为锁机制会阻塞某些线程的执行    

MessageQueue 存储结构,不能处理消息
Looper 无限循环,处理消息
ThreadLocal 获取当前线程的 Looper , 读写操作仅限于线程的内部,互不干扰
Handler 使用 Handler 就必须该线程创建了Looper,Looper是一个无限循环,Handler 与Looper的交互通过 MessageQueue 的数据结构完成;
Looper 判断当前方法的 Thread 通过 ThreadLocal 完成

消息队列的工作原理:
MessageQueue 的 插入和读取 ,读取的过程伴随删除 next , 插入为 enqueueMessage;

Looper 的工作原理:
不停地从 MessageQueue 中查看是否有新消息, 如果有新消息就会立即处理,否则就会一直阻塞在那里;
Looper.prepare();
Looper.loop();//Looper 才真正启动

Looper.prepareMainLooper();    //给 ActivityThread 创建 Looper

AMS activitymanagerservice


//Android 的线程 和线程池
线程分主线程和子线程 ,主线程主要完成界面的UI操作, 子线程主要完成 耗时操作

AsyncTask 异步任务
封装了线程和Handler,方便在子线程中更新UI

IntentService
后台服务,内部采用 HandlerThread 执行任务,不容易被系统杀死

HandlerThread
具有消息循环的线程,内部可以使用Handler的Thread
HandlerThread直接就可以获取Looper
//Use the provided instead of the default one.
    HandlerThread ht = new HandlerThread("ht");
    ht.start();
    Handler handler = new Handler(ht.getLooper()) {
        public void handleMessage(Message msg) {
        };
    };


//线程:系统调度的最小单位
//线程池:在一个进程中频繁的销毁和创建线程,系统开销很大,使用线程池缓存一定数量的线程;


//IPC 机制 InterProcess Communication 进程间通信

Android 系统会为每一个应用分配唯一的UID , 具有相同 UID 的应用 , 才能共享数据

Android 为每一个进程分配一个独立的虚拟机

1. Serializale: Java

2. Parcelable: Android 效率更高

3. Binder
虚拟的物理设备 dev/binder

Android 序列化机制和 Binder

compile 'com.android.support:appcompat-v7:23.3.0'
/home/tools/sdk/extras/android/m2repository/com/android/support/appcompat-v7/19.1.0/appcompat-v7-19.1.0.aar

//只要androidstudio编译不卡 , 使用gradle build 就不会卡;

//与插件版本关系很大
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.3'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }

// sdk 版本 sdk工具版本
compileSdkVersion 23
buildToolsVersion "21.1.0"

//Android  插件版本 Android Plugin Version
com.android.tools.build:gradle:1.3.0

//Gradle 版本 Gradle Version
/home/tools/android-studio/gradle/gradle-2.14.1
/root/RxWeather/gradle/wrapper/gradle-wrapper.properties
distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip


Gradle: Resolve dependencies':common:_debugCompile'

Gradle sync failed: Unknown host 'jcenter.bintray.com'. You may need to adjust the proxy settings in Gradle.
         Consult IDE log for more details (Help | Show Log)
         
// 先去掉项目中 build.gradle 的 compile ' , 然后再 联网 Build/Clean Project , 通过后 在添加 compile '
dependencies {
  compile fileTree(include: ['*.jar'], dir: 'libs')
  /*Square Library*/
  compile 'com.squareup.retrofit:retrofit:1.9.0'
  compile 'com.squareup.okhttp:okhttp-urlconnection:2.1.0'
  compile 'com.squareup.okhttp:okhttp:2.5.0'
  compile 'com.squareup.okio:okio:1.6.0'
  compile project(':common')
}

//AndroidStudio 工程
工程project相关:用于配置整个项目的编译环境和依赖
项目module相关:就是你的代码和配置文件


//meta 的资源是共用的,其他应用可以使用 ActivityInfo 访问 , 对应的 value 或者 resource
            <meta-data
                android:name="com.yue.zoo"
                android:value="@string/myzoo" />
                
        ActivityInfo info;
        try {
            info = this.getPackageManager().getActivityInfo(getComponentName(),
                    PackageManager.GET_META_DATA);

            String meta = info.metaData.getString("com.yue.zoo");
        } catch (NameNotFoundException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }


attribute
əˈtribju:t
vt.
认为…是; 归因于…;认为某作品出自某人之手;认为某事[物]属于某人[物]
ˈætribju:t
n.
属性, 特性

potential
pəˈtenʃəl
adj.
潜在的, 有可能的
n.
潜力, 潜势, 可能性

mechanism
ˈmekənizəm
n.
机械装置;构造, 机制;办法, 技巧, 途径

interaction
ˌɪntərˈækʃən
n.
一起活动, 合作, 配合, 相互作用

URI(Uniform Resource Identifier)—— 统一资源标识符

//touch 当前文件下的所有文件
find . -name '*' -exec touch '{}' \;

//Andorid.mk 设置应用为不分离
LOCAL_DEX_PREOPT := false

//String 不可变类 ,其对象是指向 堆内存 的引用, 对象本身存储在 栈内存 中;
 
//栈stack 快于 堆heap , 尽量使用局部变量;

long total_memory = Runtime.getRuntime().totalMemory();
long free_memory = Runtime.getRuntime().freeMemory();
android.util.Log.i("yqf", "consume == " + (total_memory - free_memory));
                
                

long start = System.currentTimeMillis();
long end = System.currentTimeMillis();
android.util.Log.i("yqf", "total == " + (end - start));

1) UI 线程不能有 耗时操作
2) 子线程不能更新UI

perfume
ˈpə:fju:m
n.
香气, 芳香;香水
vt.
使充满香气
喷香水于

accomplish
əˈkɔmpliʃ
vt.
完成, 实现, 做成功

//Dalvik Debug Monitor Server (ddms)

schedule
ˈʃedju:əl
vt.
排定, 安排
n.
时间表, 日程安排表
清单, 明细表

// 看 class 文件 使用 jd-gui

//反编译class ,  使用工具为 dex2jar 中的 dex2jar.sh
sh dex2jar.sh *.apk

//反编译资源 , 使用工具为 apktool.jar
./apktool d *.apk

//MMI 工程师
MMI : man machine interface

//音频播放
import android.media.MediaPlayer;
MediaPlayer mp = new MediaPlayer();
mp.setDataSource(context, uri);
//agold_yqf 播放
        mp.prepare();
        mp.start();


//使用 gradle 命令编译打包apk 。 build 第一次要连网
'/home/tools/android-studio/gradle/gradle-2.14.1/bin/gradle' build
//忽略lint
android {
    lintOptions {
    checkReleaseBuilds false
    abortOnError false
}
}



MVC(model view controller)
model: (Interface) 业务逻辑 处理数据 复杂算法 网络操作 数据库存取
view :UI(xml)
controller: mv 沟通桥梁 如:Activity Fragment

MVP(model view presenter)
modeol 和 View 完全解耦, 通过 presenter 通信;


Google 两部分代码:
1)开源: AOSP代码,android专用的linux内核、虚拟机、基础用户界面(设置、锁屏)
2)闭源:GMS

adb remount;adb push  out/target/product/g3v55c2k_yunshi_x/system/framework/oat/arm64/services.odex system/framework/oat/arm64;
adb push  out/target/product/g3v55c2k_yunshi_x/system/framework/services.jar system/framework;


//以开机动画为例,各参数说明如下:
480 ------开机动画的宽度
800 ------开机动画的高度
30  ------动画播放的帧率
P   ------开机动画第一部分的标志
1   ------开机动画第一部分的播放次数,0---无限循环   n---循环n次
2   ------如果循环播放,此参数用于指定动画播放的间隔时间,可以0-10
P   ------开机动画第二部分的标志
0   ------开机动画第二部分的播放次数,0---无限循环   n---循环n次
2   ------如果循环播放,此参数用于指定动画播放的间隔时间,可以0-10
M  ------模式选择标志
0   ------模式值 0---part1 part2用相同的帧数  n---part2只用n帧

//字符串转意使用 \
<string name="cannot_connect_camera">Can\'t connect to the camera.</string>

// layout_marginLeft : 该控件距离 父控件 的边距
// paddingLeft : 控件内部内容,如文本距离该控件的边距

//转乱码  linux 默认编码为 utf8
iconv -f gbk -t utf8 source_file > target_file
//转图片格式 用 GIMP 另存为图片 jpg 2 png

//Activity 生命周期:
I/yqf     ( 8591): onCreate
I/yqf     ( 8591): onStart
I/yqf     ( 8591): onResume


//-------------home
I/yqf     ( 8591): onPause
I/yqf     ( 8591): onStop
//-------------重新打开
I/yqf     ( 8591): onRestart
I/yqf     ( 8591): onStart
I/yqf     ( 8591): onResume
//-------------锁屏后
I/yqf     ( 8591): onPause
I/yqf     ( 8591): onStop
//-------------解锁后
I/yqf     ( 8591): onRestart
I/yqf     ( 8591): onStart
I/yqf     ( 8591): onResume


//-------------back
I/yqf     ( 8591): onPause
I/yqf     ( 8591): onStop
I/yqf     ( 8591): onDestroy


//-------------重新启动应用
I/yqf     ( 8591): onCreate
I/yqf     ( 8591): onStart
I/yqf     ( 8591): onResume


//-------------MENU

I/yqftest (20373): ####onPause####
I/yqftest (20373): ####onStop####

//
I/yqftest (20373): ####onRestart####
I/yqftest (20373): ####onStart####
I/yqftest (20373): ####onResume####



//接收 开机广播 必须加下面权限
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

//打开adb
/home/project/55/20160418/android/alps/system/core/adb/adb_main.cpp

//Linux UTF-8  Windows GBK

//menu
import android.view.Menu;

       @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.dialtacts_options_acloud, menu);
        return super.onCreateOptionsMenu(menu);
    }


    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.menu_import_export:
        }
        return super.onOptionsItemSelected(item);
    }


delegate
ˈdeliɡit
n.
代表, 代表团成员
ˈdeliɡeit
vt.
任命或委派…为代表;托付


//AndroidStudio 使用 Ctrl Alt 空格 快捷方式联想

//文件路径
/data/data/com.android.providers.media/databases

//adb 发送广播
adb shell am broadcast -a " "

gcc yue.c -o yue;./yue;rm -r ./yue

// recycler_item.xml "20dp" 为item的高度,其余可为 "match_parent"
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="20dp"
    android:background="@android:color/black">

    <TextView
        android:id="@+id/text_item"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:textColor="@android:color/white" />
</RelativeLayout>


//使用 recyclerview
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.4.0'
    compile 'com.android.support:recyclerview-v7:23.4.0'
}


//打开sdcard中的html文件 , 文件路径前需加 file:///

    private void startHtml() {
        final Intent intent = new Intent();
        Uri uri = Uri.parse("file:///sdcard/" + "agreement.html");
        intent.setData(uri);
        intent.setClassName("com.android.htmlviewer",
                "com.android.htmlviewer.HTMLViewerActivity");
        startActivity(intent);
    }

apt-get install gedit-plugins

//开机logo需删除 /home/project/55c2k/1009/android/alps/agold_img/g3v55c2k_yunshi_x/obj/BOOTLOADER_OBJ

//开关机动画需删除 /home/project/55c2k/1009/android/alps/vendor/mediatek/proprietary/custom/g3v55c2k_yunshi_x/system

//将当前目录下的所有文件压缩为 aa.zip
zip -r aa.zip ./20161012_g3v55c2k_yunshi_x/ ./target_files-package.zip


malformation
ˌmælfɔ:ˈmeiʃən
n.
难看,畸形


//分析 ANR ,定位 data/anr

//Android jni 需要下载NDK工具 : android-ndk-r10b
1.新建与src同级的jni文件夹
2.cd到src文件,执行 javah -d ../jni com.agold.aatest.MainActivity         // -d ../jni     表示生成h文件的输出路径
生成头文件 com_agold_aatest_MainActivity.h
3.jni下创建Android.mk , hello.c
4.cd 到 jni 下 执行 /home/android-ndk-r10b 中的 ndk-build 命令
工程下会生成 /root/workspace/AAtest/obj/local/armeabi
5.eclipse中刷新可看到新生成的文件夹,run工程


//adb 卸载应用 (应用包名)
adb uninstall com.android.mms
adb shell pm list packages

//textview 能够自动区分 web链接 联系人
android:autoLink="all"


//AndroidStudio 使用JNI
/home/MyDemo/app/build.gradle

//android-ndk-r10b ndk-build 编译so
//在 /home/MyDemo/app/src/main  新建 jniLibs , 存放生成好的so文件 如 /home/MyDemo/app/src/main/jniLibs/armeabi/libhello_jni.so

//这句话必须加在Module的 build.gradle 中 Android 中, 确认将 so文件打包到 APK 中
//-------------------add----------------------
    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }
//--------------------add---------------------
apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "21.1.0"

    defaultConfig {
        applicationId "com.yue.root.mydemo"
        minSdkVersion 21
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }

}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.4.0'
}


//修改当前文件下所有文件的权限
 chmod 777 * -R


//send mms
    Uri uri = Uri.parse("smsto:" + number);
    Intent mIntent = new Intent(Intent.ACTION_SENDTO);
    mIntent.setData(uri);
    mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    mContext.startActivity(mIntent);

compress
kəmˈpres
vt.
压紧, 压缩

compact
kəmˈpækt
vt. & vi.
压紧, (使)坚实
adj.
装填紧密的, 整齐填满的
ˈkɔmpækt
n.
协议, 条约, 契约


// AsyncTask 使用
new WifiTask().execute();

private ProgressDialog pd;

    class WifiTask extends AsyncTask<Void, Void, Void>{

            @Override
            protected Void doInBackground(Void... params) {
            //放耗时操作,不要再有新线程start
                WifiSettings wifiSettings = new WifiSettings();
                transaction.replace(R.id.fragment_container, wifiSettings);
                return null;
            }
            
            @Override
            protected void onPreExecute() {
                if(pd == null){
                    pd = new ProgressDialog(getActivity());
                    pd.setCancelable(false);
                    pd.show();
                }
                super.onPreExecute();
                
            }
            @Override
            protected void onPostExecute(Void result) {
                super.onPostExecute(result);
                //更新UI
                if(pd!=null){
                    pd.dismiss();
                    pd = null;
                }
            }
            
        }


//启动系统的各个服务:
/home/project/55c2k/0919/android/alps/frameworks/base/services/java/com/android/server/SystemServer.java


//Activity的启动模式
Activity的启动模式包含四种,分别是:standard、singleTop、singleTask、singleInstance,我们可以在manifest里通过Activity的launchmode进行指定
1)standard模式
这是Activity的标准启动模式,如果我们不对Activity做任何特殊处理的情况下就默认为该模式启动,所以该模式并不需要在manifest或者Intent里进行指定。这个模式的问题在于会导致一个任务栈里会有多个该Activity的实例存在,很简单的一个例子就是我们在AcitivytA里启动ActivityA这样就会有两个ActivityA存在。假如说该Activity非常消耗资源,那么就有必要考虑下更改下Activity的启动模式了。

2)singleTop模式
该模式简单来说,启动的Activity已经在任务栈的栈顶话,那么再启动这个Activity的时候就不会创建该实例,同时会调用该Acitivity的onNewIntent方法(前面有提过该方法)。但是如果该Activity不在栈顶的话,那么启动它的行为与standard模式并没有什么区别。

3)singleTask模式
singleTask指的是一个任务栈中只能存在一个这样的Acitivity。但是需要我们注意的是如果任务栈中没有该Activity的话系统就会帮我们创建一个Acitivity压入栈顶,但是如果存在该Activity的话就会销毁压在该Activity上的所有Activity最终让创建出来的Activity实例处于栈顶,同时也会回调该Activity的onNewIntent方法。

4)singleInstance模式 (单独任务栈)
该模式是四个模式当中最为特殊的一个,设置了该模式启动的Acitivyt会在一个独立的任务栈中开启,同时该任务栈有且只有一个这样的Activity实例,每次再启动这个Activity的时候就会在该任务栈里重用该Activity同时回掉onNewIntent方法。
singleInstace与singleTask的区别在于:singleTask启动的Activity在系统层面上来说是可以有多个实例的。比如说应用程序A想调用singleTask模式下的ActivityA,而应用程序B也同样调用了,那么在应用程序A和B中就会各有一个ActivityA的实例。但如果该ActivityA是singleInstance模式的话,那么无论有多少个应用程序调用它,它都只可能在系统中存在一个实例同时该实例还是位于它自己的一个单独的任务栈中。

5)通过Intent中setFlags来指定启动模式
1.Intent.FLAG_ACTIVITY_NEW_TASK
使用一个新的任务栈来启动一个Activity,该flag通常用于在Service中启动Activity的场景,因为Service中并不存在有Activity任务栈所以通常通过这种方式来新启动一个Activity任务栈并创建新的Activity实例。
2.Intent.FLAG_ACTIVITY_SINGLE_TOP
与在manifest文件里的launchmode指定"singleTop"作用一样
3.Intent.FLAG_ACTIVITY_CLEAR_TOP
与在manifest文件里的launchmode指定"singleTask"作用一样
4.Intent.FLAG_ACTIVITY_NO_HISTORY
设置了该Flags的Activity在启动其他Activity后该Activity就消失了,不会保留在Activity栈中,此Activity可以作为一个中转Activity来负责启动其他的Activity。


//Linux 下的垃圾箱
/home/.Trash-0

//反斜线用来转意:
grep -r "long\[] " .  


react
riˈækt
vi.
起反应; 有影响;反对; 对抗



//user 版本使用 eng 版本的 boot.img 可以抓MTKlog adb root;adb remount


macro
ˈmækrəu
n.

adj.
巨大的,大量使用的

//设置 16进制 颜色 ff 为不透明
btn.setBackgroundColor(0xff000000);


import static android.util.Log.i;

i("yqftest", "imporrt static");//静态导包直接在类中使用静态对象中的方法
     

package com.example.root.myapplication;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * Created by root on 16-8-22.
 */
public class MyLogUtil {

//    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    private static final String PATH = "/sdcard/mylog";

    public static void mylog(String str){
        FileOutputStream fileOutputStream = null;
        try {
            fileOutputStream = new FileOutputStream(PATH);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        byte[] bytes = str.getBytes();
        try {
            fileOutputStream.write(bytes);
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            fileOutputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


//modem
/home/project/55c2k/0811/android/alps/vendor/mediatek/proprietary/modem

/home/project/53/0808/android/alps/build/target/product/core.mk

//Sublime Text
subl  // Open the file

Ctrl Shift k : delete the line
Ctrl g : go to the line

Looper.prepare();
Looper.loop();


        new Handler().post(new Runnable() {
            @Override
            public void run() {
                openWifi();
            }
        });



    private Handler handler = new Handler();
    
    final Button btn = (Button)findViewById(R.id.btn);
    handler.post(new Runnable(){
    @Override
    public void run() {
    btn.setText("change_ui");
            }
        });
    }
    
//使用    handler.post(new Runnable()); 的方法 相当 自己复写子线程,将耗时操作放到子线程中,
//耗时操作执行完成后再发送handler.sendEmptyMessage(int what)
//通过    handleMessage(msg); 的方法接收消息 , handler.post的方法更加方便简洁;

// Handler postDelayed

    new   Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
                                            
                    }
        },1000);

//定义回调:

MyCallBackListener mMyCallBackListener;

        this.mMyCallBackListener = mMyCallBackListener;

    }

    public void useCallBackMethod() {
        mMyCallBackListener.callBackMethod(num);
    }

    interface MyCallBackListener {

        void callBackMethod(int i);
    }

//使用回调:

public class TwoActivity extends ActionBarActivity implements
        MyCallBackListener {
        
                MainActivity mm = new MainActivity();
                mm.setMyCallBackListener(TwoActivity.this);
                mm.useCallBackMethod();        

    @Override
    public void callBackMethod(int i) {
        // TODO Auto-generated method stub
        Log.i("yqftest", "callBackMethod == " + i);
    }




//Java 回调函数:

package com.yqf;

public class Button {

    OnclickListener mOnclickListener;

    public void setOnclickListener(OnclickListener mOnclickListener) {

        this.mOnclickListener = mOnclickListener;
    }

    public void clickDown() {

        mOnclickListener.OnClick(10);

    }

    interface OnclickListener {

        void OnClick(int i);
    }

}


package com.yqf;

import com.yqf.Button.OnclickListener;

public class Mine implements OnclickListener {

    @Override
    public void OnClick(int i) {
        // TODO Auto-generated method stub
        System.out.println(i);
    }

}

package com.yqf;

public class Main {

    public static void main(String[] args) {

        Button btn = new Button();
        btn.setOnclickListener(new Mine());
        //通过Button的方法clickDown(),回调自己的方法OnClick(int i)
        btn.clickDown();
    }

}

        Intent intent = new Intent();
        intent.setType("audio/*");
        intent.setAction(Intent.ACTION_SEND);
        Uri uri = Uri.parse(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI + "/"+audioID);
        intent.putExtra(Intent.EXTRA_STREAM, uri);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(Intent.createChooser(intent, getResources().getString(R.string.pop_share_way)));


//which context
if(mContext instanceof DialtactsActivity){
    DialtactsActivity activity = (DialtactsActivity)mContext;
    activity.editBeforeCall(number);
    }
    

static 定义常量必须放在方法外面,与方法同级;


// Intent 隐式启动 一定要加:        <category android:name="android.intent.category.DEFAULT" />

        <activity android:name="TwoActivity" >
            <intent-filter>
                <category android:name="android.intent.category.DEFAULT" />

                <action android:name="com.example.btntest.TWOACT" />
            </intent-filter>
        </activity>



///获取进程
ps -ef        (ps aux)
kill pid



if()    /// 满足条件后,即使else if() 满足条件,else if后面语句也不再执行
else if()

root@yqf:~/桌面/on# mogrify -format png *.jpg

rm -r *.jpg

mogrify -resize 720x1280 *.png

    
///关闭输入法

private void hideInputmethod(View v) {
        if(getActivity()==null){
            return;
            }
                InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
                if (imm != null) {
                    imm.hideSoftInputFromWindow(v.getApplicationWindowToken(), 0);
                }
    }


//    Vim
i      进入插入模式
:wq  保存并退出
:q!     强制退出


////使用 Fragment

///在Activity中

    getFragmentManager().beginTransaction().add(R.id.fragment_container, new MyFragment()).commit();

    <FrameLayout
        android:id="@+id/fragment_container"
        android:layout_width="match_parent"
        android:layout_height="100dp" />

////    MyFragment

public class MyFragment extends Fragment {
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        View view = inflater.inflate(R.layout.fragment_main, null);
        return view;
    }
    
}


////actionBar

    actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM, ActionBar.DISPLAY_SHOW_CUSTOM|ActionBar.DISPLAY_HOME_AS_UP);        ///这句话必须加 不然无效
    final View actionContent = LayoutInflater.from(actionBar.getThemedContext()).inflate(R.layout.action_bar_settings, null);
    TextView title=(TextView)actionContent.findViewById(R.id.action_title);
    title.setText(R.string.pick_wallpaper);
    actionBar.setCustomView(actionContent, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
    ImageView ivBack=(ImageView)actionContent.findViewById(R.id.action_back);


///查看apk 的 version
cd /home/tools/sdk/build-tools/android-5.0
./aapt dump badging '/root/桌面/acloudyouwa.apk' |grep version
package: name='com.threedime' versionCode='19' versionName='1.3.0' platformBuildVersionName='6.0-2166767'

全局常量 public static final     
成员变量 private
局部变量 int i = 0;

//macro
/home/project/53/20151218/android/alps/build/target/product/AgoldDefaultParameter.sh


// Intent     Bundle   put

    Bundle bundle = new Bundle();
        bundle.putInt("test", 111);
        bundle.putString("people", "123");
        intent.putExtras(bundle);
        
// Intent     Bundle   get

        Bundle num = getIntent().getExtras();
        int i = num.getInt("test");
ps:

        Bundle num = getIntent().getExtras();
        Log.i("yqftest", " first == " + num);
        int i = num.getInt("test");
        Log.i("yqftest", i + "  " + num);
        
01-02 05:19:38.897 31168 31168 I yqftest :  first == Bundle[mParcelledData.dataSize=64]
01-02 05:19:38.897 31168 31168 I yqftest : 111  Bundle[{people=123, test=111}]


//Intent 拨号
String number = "911";
Intent mIntent = new Intent(Intent.ACTION_CALL,Uri.parse("tel:"+number));
startActivity(mIntent);

// yqflog
<!--####yqf#### -->
android.util.Log.i("yqflog","####yqf####");

gedit ~/.bashrc
source ~/.bashrc


// Ubuntu 中卸载软件
dpkg --list | gedit
sudo apt-get --purge remove file-roller   

android:sharedUserId="android.uid.system"         ////会导致 WebView 不能使用!!!


// Intent
    startActivity(mIntent);    ///跳转到下个页面,再返回 无log
                
    startActivityForResult(mIntent, 666);///跳转到下个页面,再返回log如下
    
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);
        Log.i("yqf", "requestCode==" + requestCode + "    resultCode==" + resultCode);
    }

01-02 08:54:26.768: I/yqf(4926): requestCode==666    resultCode==0

///在跳转后的Activity中 设置

setResult(777);   
///只有当前的Activity被 finish掉后 才会打log
01-02 08:57:59.362: I/yqf(5091): requestCode==666    resultCode==777



//判断当前是否为24小时制,是则显示24小时制时间,否则显示12小时制时间
            boolean is24Hour = DateFormat.is24HourFormat(context);
            if (is24Hour) {
                date=(String) DateFormat.format("yyyy年MM月dd日 HH:mm", when);
            } else {
                date=(String) DateFormat.format("yyyy年MM月dd日 hh:mm a", when);
            }


55 平台,音频参数对应手机端目录:/system/etc/audio_param
紧急处理时,可以将参数文件复制到 /system/etc/audio_param 目录下面,直接 snod 打包即可。
为防止 snod 时,编译脚本重新覆盖,最好是在对应项目的 misc 里面也放一份改动后的音频参数。

//按键相关
alps/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java

/// 跳转页面
/// 对应 包名和类名  简洁
    Intent intent = new Intent();
    intent.setClassName("","");  
    context.startActivity(intent);

    // KeyEvent.KEYCODE_MEDIA_PREVIOUS
    // KeyEvent.KEYCODE_MEDIA_NEXT
    // KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE
    public void doMusicIntent(int keyevent) {
        Intent mIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);
        mIntent.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(
                KeyEvent.ACTION_DOWN, keyevent));
        sendBroadcast(mIntent);
        mIntent.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(
                KeyEvent.ACTION_UP, keyevent));
        sendBroadcast(mIntent);
    }

/// 获取资源中的 String
context.getResources().getString(R.string.scan_qrimage)
context.getText(R.string.music_disconnect_hint)

///写入Settings数据库
String value = "iphone";//"android"
Settings.Global.putString(context.getContentResolver(), "connect_phone_type", value);

/// 指的是控件里面内容的位置 如 Button的text
android:gravity="center"

// action        格式:包名 + 大写字母
private static final String ACTION_SETTINGS_SETUP = "com.mediatek.settings.SETTINGS_SETUP_FOR_OOBE";

import android.content.SharedPreferences;

private SharedPreferences mSharedPreferences;

            SharedPreferences mSharedPreferences = context.getSharedPreferences("contacts", Context.MODE_PRIVATE);
//写入        
            Editor edit = mSharedPreferences.edit();
            edit.putString("phone", songTitle);
            edit.commit();
//读取
String tmp = mSharedPreferences.getString("phone", "");    
            
String phone = getApplicationContext().getSharedPreferences("contacts", MODE_PRIVATE).getString("phone", "");    


/// 默认打开 WIFI
android.permission.ACCESS_WIFI_STATE
android.permission.CHANGE_WIFI_STATE
android.permission.WAKE_LOCK

WifiManager wifiManager = (WifiManager) this.getSystemService(Context.WIFI_SERVICE);
    wifiManager.setWifiEnabled(true);  
    
/////  Android JSON 使用
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

/// put 值
try {
    JSONArray jsonArray = new JSONArray();
    JSONObject json = new JSONObject();
    json.put("songTitle", songTitle);
    json.put("musicPlaying",musicPlaying);
    jsonArray.put(json);
    String eventData = jsonArray.toString();
    } catch (JSONException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
        }
                
/// get 值  eventData为获取的String
try {
    JSONArray jsonArray = new JSONArray(eventData);
    JSONObject jsonObject = jsonArray.getJSONObject(0);
    String songTitle = jsonObject.getString("songTitle");
    String musicPlaying = jsonObject.getString("musicPlaying");
    } catch (JSONException e) {
        e.printStackTrace();
        }
    }


// intent flag
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

//  对应键值
/home/project/53/20160118/android/alps/frameworks/base/core/res/res/values/attrs.xml


///  遇到 adb 找不到设备,首先 lsusb 查看是否有MTK设备,如果有, 使用任务管理器杀死 adb

////  清除缓存log
adb logcat -c

////////////       动态广播
import android.content.BroadcastReceiver;
import android.content.Intent;
import android.content.IntentFilter;

private BroadcastReceiver receiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            // TODO Auto-generated method stub
            String action = intent.getAction();
            if ("android.intent.action.PACKAGE_ADDED".equals(action)) {
                android.util.Log.i("yqftest","####BroadcastReceiver####");
            }
        }
    };
////   在onCreate  中 注册
        IntentFilter filter = new IntentFilter();
        filter.addAction(MUSIC_NEXT_MSG);
        registerReceiver(receiver, filter);

////   在onDestroy  注销
        unregisterReceiver(receiver);

/// 获取当前时间
System.currentTimeMillis();

import java.text.SimpleDateFormat;

String date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(System.currentTimeMillis());

// 在 apn中 主要看这三项!!!
mcc="234"
mnc="30"
apn="everywhere"

//MTK 进入 Recovery
adb reboot recovery
//开机键  音量上   进入机器人界面  按 home键

 //获取当前应用的包名 类名
   
   private Context mContext;
   
    private boolean isInPackage(String packageName) {
    
        boolean result = false;
        ActivityManager mActivityManager = (ActivityManager) mContext
                .getSystemService(Context.ACTIVITY_SERVICE);
        List<RunningTaskInfo> rti = mActivityManager.getRunningTasks(1);
        String pn = rti.get(0).topActivity.getPackageName();
        String cn = rti.get(0).topActivity.getShortClassName();
         Log.i("yue", "pn=="+pn+", cn =="+cn );
         //     pn==com.mediatek.oobe, cn ==.LanguageSettingsWizard
        if (pn.equals(packageName))
            result = true;
        return result;
    }
    

// NFC 短距高频无线电技术

//写号:
1.最长
2.同名第一个


//王垠  “抽象”           只选对的,不选难的


//Ubuntu 修改字体安装高级设置  
sudo apt-get install gnome-tweak-tool

// 设置gnome默认启动主题
sudo /usr/lib/lightdm/lightdm-set-defaults -s gnome-fallback

// 设置unity2d默认启动主题
sudo /usr/lib/lightdm/lightdm-set-defaults -s ubuntu-2d

//session 配置文件
/etc/lightdm/lightdm.conf

// android studio 快捷键 Space

Ctrl Shift Space // 自动补全代码

Ctrl T (自己改)// try catch

Alt Enter  //类型转换

ctrl alt L(改为F) //自动对齐

ctrl + O       //继承复写

ctrl + i  //实现接口

Alt + Insert //构造函数

// ROM 工具
cd /home/tools/RomManager_4.7.5/tools
./tool -lp=. -ip=/root/20160111_c220v35_ps -gs=/home/yue //解压到 /home/yue 路径下
./tool -lp=. -ip=/root/20160111_c220v35_ps go        //打包后 /home/yue 这个路径下的yue文件夹就自动消失

//frameworks里面的相关配置
/home/project/53/20151215/android/alps/frameworks/base/core/res/res/values/config.xml

//修改wifi获取时间:
/home/project/53/20151130/android/alps/frameworks/base/services/core/java/com/android/server/NetworkTimeUpdateService.java
/home/project/53/20151130/android/alps/frameworks/base/core/res/res/values/config.xml

//查看build.prop:
adb shell getprop ro.mtk_2sdcard_swap

//手机加密 encrypt:
device/mediatek/mt6735/fstab.mt6735中的forceencrypt 改成 encryptable

//控制音量键
adb shell input keyevent 24
3 home
4 back

//加书签: Crtl + d

//USB调试
/home/project/53/20151130/android/alps/build/core/main.mk
/home/project/53/20151130/android/alps/agold_img/c220v35_ps/root/default.prop
./mk c220v35_ps -o user k bootimage

//MTK默认的宏:
/home/project/53/20151130/android/alps/build/agold/config/backup/mt6735/cu/ProjectConfig.mk

//AgoldDefaultParameter常用宏的配置:
/alps/build/target/product/AgoldDefaultParameter.sh


nodpi 为图片保持原始尺寸
720P     xhdpi    1280*720
1080P   xxhdpi     1920*1080


adb logcat>/root/桌面/log


git pull
//上传到服务器:

git status ;
git add -f . ;
git commit -m 'yueqifeng ' ;
git push origin master

//设置按钮只能点击一次
        private Boolean isOnclick=true;
        btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                if (isOnclick) {
                    Toast.makeText(MainActivity.this, "1", 0).show();
                    isOnclick = false;
                }
            }
        });


shutdown -h 22:00

//3h 后关机
shutdown -h 180
// 取消定时关机
shutdown -c

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1435次
    • 积分:63
    • 等级:
    • 排名:千里之外
    • 原创:5篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章存档