zoukankan      html  css  js  c++  java
  • Android复习

    第一章内容

    1.Android系统架构:(四层)

    Linux内核层:为安卓设备的各种硬件提供底层的驱动。
    系统运行库层:为Android系统提供主要的特性支持。
    应用框架层:提供了构建应用程序可能用到的各种API。
    应用层:所有安装在手机上的应用程序都属于这一层。

    2.Android系统四大组件:

    活动(activity)提供活动界面 服务(service)提供多线程或后台运行支持 广播接收器(broadcast receiver)提供系统与程序或程序与程序的通信机制 内容提供器(content provider)提供程序间共享数据的机制

    3.开发环境需要的工具:

    JDK(Java语言的软件开发工具包)Android SDK(谷歌提供的Android开发工具包)Android studio(Android项目IDE开发工具)

    4.安卓模拟器:

    是模拟Android手机环境,用于Android app开发。注:app:项目中所有资源代码在此。

    5.使用Android的日志工具Log:

     Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, "Hello", Toast.LENGTH_SHORT).show();
            }
    
        });
        Log.d("MainActivity","onCreate execute");
    }
    
    (在onCreate()方法中)
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.hello_world_layout);
        Log.d("HelloWorldActivity","onCreate execute");
    }
    

    注:Log.v()用于打印意义最小的,琐碎的日志信息。Log.d()用于打印一些调试信息。Log.i()用于打印一些警告信息。Log.e()用于打印程序中的错误信息。

    5.手动创建活动步骤:

    close project再新建一个Android项目,可命名为ActivityTest,包名使用默认的。再选择Add No Activity手动创建活动finish。项目成功创建后,手动改为project模式,点击Java文件夹下com.example.activitytest包右键新建activity到empty activity,弹出对话框,命名,不要勾选generate layout和launcher activity这两个选项。勾选backwards compatibility,点击finish完成创建。

    6.创建和加载布局:

    右击app/src/main/res目录new一个Directory,命名为layout,在对着layout目录右键new一个layout resource file,在新窗口将布局文件命名为first——layout,根目录默认,点击ok完成创建。
    接下来在活动中加载这个布局,重新回到FirstActivity,在onCreate()方法中加入:

    public class FirstActivity extends AppCompatActivity{
        protected void onCreate((Bundle savedInstanceState){
               super.onCreate(savedInstanceState);
             setContentView(R.layout.first_layout);
       }
    }
    

    7.在AndroidManifest文件中注册活动:(修改后的AndroidManifest.xml文件)

    <manifest xmls:android="http://schemas.android.com/apk/res/android"
    package="com.example.activitytest">
    <application
    ...>
    <activity android :name=".FirstActivity"
        android:label="This is FirstActivity">
     //  <intent-filter>
           <action android:name="android.intent.action.MAIN"/>
           <category android:name="android.intent.category.LAUNCHER"/>
     //  </intent-filter>
    </activity>
    </application>
    </manifest>
    

    8.在活动中使用Toast(在onCreate()方法中)

    添加如下方法:

    protect void onCreate(Bundle savedInstanceState){
       super.onCreate(savedInstanceState);
       setContentView(R.layout.first_layout);
       Button button1=(Button)findViewById(R.id.button_1);
       button1.setOnClickLIstener(new View.onClickListener(){
    @Override
       public void onClick(View v){
         Toast.makeText(FirstActivity.this,"You clicked Button1",
         Toast.LENGTH_SHORT).show();
    }
    })
    }
    

    9.使用显式Intent:

    修改FirstActivity中按钮的点击事件,代码如下所示:

    button.setOnClickListener(new View.OnClickListener(){
    @Override
    public void onClick(View v){
        Intent intent =new Intent(FirstActivity.this,SecondActivity.class);
        startActivity(intent);
    }
    });
    

    10.向下一个活动传递数据:

    imageView.setOnClickListener(new View.OnClickListener(){
                @Override
                        public void onClick(View v){
    
                    Intent intent = new Intent(MainActivity.this,DetailActivity.class);
                  intent.putExtra("title",news0.title);
                    intent.putExtra("content",news0.content);
                    intent.putExtra("Source",news0.Source);
                    intent.putExtra("Time",news0.Time);
                    startActivityForResult(intent,2);
                }
            });
    

    比如说FirstActivity中有个字符串,现在想把这个字符串传递到Second-Activity中,则:

    button1.setOnClickListener(new View.OnClickListener(){
    @override
    public void onClick(View v){
     string data ="Hello SecondActivity";
    Intent intent =new Intent(FirstActivity.this,SecondActivity.class);
    intent.putExtra("extra_data",data);
    startActivity(intent);
    }
    });
    

    在把SecondActivity中传输的数据取出,并打印出来,代码如下:

    public class SecondActivity extends AppCompatActivity{
    @override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R,layout.second_layout);
        Intent intent = getIntent();
       String data=intent.getStringExtra("extra_data");
       log.d("SecondActivity",data);}
    
    }
    

    11.返回数据给上一个活动

    修改firstactivity中按钮的点击事件

    button1.setOnClickListener(new View.OnClickLIstener(){
     @override
     public void onClick(View v){
       Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
       startActivityForResult(intent,1);
    }
    });
    

    在secondactivity中给按钮注册点击事件,并添加返回数据的逻辑

    public class SecondActivity extends AppConpatActivity{
    @override
    protected void onCreate(Bundle saveInstanceState){
    super.onCreate(saveInstanceState);
    setContentView(R.layout.second_layout);
    Button button2 =(Button) findViewByid(R.id.button_2);
    button2.setOnClickListener(new View,onClickListener(){
    @override
    public void onClick(View v){
    Intent intent = new Intent();
    Intent.putExtra("data_return","Hello FirstActivity");
    setResult(RESULT_OK,intent);
    finish();
    }
    });
    }
    }
    

    我们还需要在FirstActivity中重写这个方法来得到返回的数据

    @override
    protected void onActivityResult(int requestCode,int resultCode,Intent data){
    Switch (requestCode){
    case 1:
    if(resultCode == RESULT_OK){
       string returnedData = data.getStringExtra("data_return");
       Log.d("FirstActivity",returnedData);
    }
    break;
    default;
    }
    }
    
    在secondactivity中重写onBackPressed()方法
    @override
    public void onBackPressed(){
     Intent intent = new Intent();
    intent.putExtra("data_return","Hello FirstActivity");
    setResult(RESULT_OK,intent);
    finish();
    }
    

    12.活动的生命周期:

    活动(栈顶)-暂停-停止-销毁 完整生存期-可见生存期-前台生存期

    .碎片的创建:

    在layout目录上右键选择new-fragment-fragment(blank)

    14.动态添加碎片(重点)

    Public class detailFragment extends Fragment{
    @Override
    Public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle saveInstanceState){
    View view = inflater.inflate(R.layout.detail_fragment,container,false);
    return view;
    }
    } 
    

    15.广播机制:

    1标准广播完全异步执行的广播,发出后所有广播接收器同时接收到广播消息。
    2有序广播:是同步执行的广播,发出后优先级高的收到,逻辑执行完毕后才会继续传播。

    16.发送自定义广播(标准,有序)以及接受(重点)

    MainActivity的代码

    public class MainActivity extends AppC ompatActivity (
    @0verride
    protected void onCreate (Bundle savedInst anceState) (
    sup er. onCreate (savedInstanceState);
    setContentVi ew (R. layout. activity_ .main);
    Button btnSend= (Button) findViewById(R. id. btnSend);btnSend. setOnCli ckListener ((v) + [
    Intent intent=new Intent ();
    intent. setAction(" com. example. myapplication. broadcast");intent. putExtra(" extr aKey", "CustomValue"); .sendBroadcast (intent):[
    
    ));
    ))
    

    继承BroadcastReceiver,实现其onReceive方法 接收第一个APP发出的广播并在后台日志输出

    public class MyReceiver extends BroadcastReceiver (
    private static final String TAG = "MyReceiver";public MyReceiver () [
    
    @0verride
    public void onReceive (Context context, Intent intent) {
    if (intent. getAction()). equals(" com. example. myapplication. broadcast")){
    String extraKey=intent. getStringExtra(" extraKey");
    Ioast. makeText (context, "接受到的自定义广播数据为: "+extraKey, Toast. LEIGTH_ SH0RT). show O;
    Log. d(TAG, "接受到另一个app的自定义广播数据为:"+extraKey);
    
    }}}
    

    AndroidMainfest.xml添加如下代码

    <receiver
        android:name=".MyReceiver"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
            <action android:name="com.example.myapplication.broadcast"></action>
        </intent-filter>
    </receiver>
    

    静态广播接收器声明权限

    <uses-permission android:name=”android.permission.ACCESS_NETWORK_STATE”></uses-permission>
    <uses-permission android:name=”android.permission.RECEIVE_BOOT_COMPLETE”></uses-permission>
    

    静态注册

    <receiver
    Android:name=”.MyReceiver”
    Android:enabled=”true”
    Android:exported=”true”>
    <intent-filter>
    <action android:name=”android.intent.action.BOOT_COMPLETED”></action>
    </intent-filter>
    </receiver>
    </application>
    

    17.SQLite数据库存储——创建数据库,添加数据(关键)

    新建一个NewsDB类,在类里面设计数据库:

    public class NewsDB extends SQLiteOpenHelper{
    @Override
    Public void onCreate(SQLiteDatabase db){
    String sql =”ccreate table NewsTable(“
    +”nID integer primary key autoincrement,”
    +”Title text,”
    +”Content text,”
    +”Source text,”
    +”Time text”)”;
    db.execSQL(sql);
    }
    插入数据
    Public void initData(){
    Cursor cursor=queryBySQL(“select count(*)num from NewsTable”);
    If(cursor!=null&&cursor.moveToFirst()){
    If(cursor.getInt(cursor.getColumnIndex(“num”))==0){
    SQLiteDatabass db =getWritableDatabase();
    db.execSQL(“insert into NewsTable(Title,Content,Source,Time)values(‘xxx’,’x’,’x’,’x’)”);
    }
    }
    Cursor.close();
    }
    

    18.ContentResolver的用法接受系统数据(重点)

     private void readContacts(){
            Cursor cursor=null;
            cursor=getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                    null,null,null,null
            );
            if(cursor!=null){
                while (cursor.moveToNext()){
                    //获取联系人姓名
                    String name= cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                    //获取联系人电话
                    String number= cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                    contactsList.add(name+"
    "+number);
                }
                adapter.notifyDataSetChanged();
            }
    
        }
    

    19.URI统一资源标识符:

    用于标识某一外部资源名称的字符串 。

    20.线程间通讯,声明,调用(重点)异步机制

    //开始按钮
    btnStrat.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            value=Integer.valueOf(editText.getText().toString());
            thread=new Thread(new Runnable() {
                @Override
                public void run() {
                    while (value>=0 &&!isPause){
                        value--;
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        handler.sendEmptyMessage(value);
                    }
                }
            });
            thread.start();
            isPause=false;
        }
    });
    
  • 相关阅读:
    2017.11.22 mysql数据库实现关联表更新sql语句
    2017.11.21 基于JSP+Servlet+JavaBean实现复数运算(二)
    2017.11.20 基于JSP+Servlet+JavaBean实现复数运算(一)
    2017.11.19 如何设计好的数据库
    [专项]链表面试题汇总
    java 的三种代理模式
    我们为什么要使用AOP?
    十张图让你了解阿里公司架构设计的发展变化史(yet)
    Java程序员从阿里、京东、美团面试回来,这些面试题你会吗?(yet)
    [专项]jvm面试题(yet)
  • 原文地址:https://www.cnblogs.com/Damonblogs/p/10181414.html
Copyright © 2011-2022 走看看