安卓项目学习记录

tech2024-01-29  77

第一章内容 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.活动的生命周期: 活动(栈顶)-暂停-停止-销毁 完整生存期-可见生存期-前台生存期 13.碎片的创建: 在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+"\n"+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; } });
最新回复(0)