热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

“.NET研究”Eclipse开发Android应用程序入门

翻译:赵锟原文出处:http:www.smashingmagazine.com20101025get-started-developing-for-

  翻译:赵锟
  原文出处:http://www.smashingmagazine.com/2010/10/25/get-started-developing-for-android-with-eclipse/

  如今的移动设备应用程序开发充满着让人振奋的东西。功能强大的硬件支持,平板电脑,多样的软件平台(塞班 OS,iOS,WebOS,Windows Phone 7…),移动设备开发者前景充满了机会和挑战。

  当你想要开始开发你的移动设备程序时,如此多的选择可能让你产生困扰。究竟应该选择神马平台?我应该学习神马语言?为你计划的项目选择神马工具?在本教程中,你将学会如何在Google公司的开源移动设备操作系统Android下开发应用程序。

  为神马选Android

  Android是一个基于Linux内核的开源平台, 并且被安装在来自于不同厂商的上千种设备中。Android将各种移动设备的硬件如 电子罗盘,摄像头,GPS,方向感应,等等暴露给你的应用程序。
  Android的免费开发工具可以让你以0成本开始编写你的软件。当你想向世界展示你的应用程序的时候,你可以将你的软件发布到Google的 Android 市场。向Andriod Market 发布程序只一次性的收取注册费用(25元),并且不像苹果的App Store ,对每一次的提交都要做检查,除非你的程序明显地违法,在经过一个快速检查的流程后,才能让你的程序提供给客户下载和购买。

  下面是Android对于开发者的优点:

  • Android的SDK可以在Windows,Mac和Linux上运行,因此你不需要为了开发环境支付额外的新硬件投入。(译者注:我曾近在Win7 64x + VMWare上成功的安装Mac Snow leopard + XCode的开发环境,对于爱用盗版的人来说,这点MS优势不是很大啊)
  • 构建于JAVA上的SDK。如果你熟悉JAVA语言,你就是事半功倍了。(译者注:这个酷壳有篇文章讨论过,大家可以参看:http://coolshell.cn)
  • 你只要在Android Market上发布应用程序,你将有潜在的成千上万的用户。而且你不一定非要把程序发布在Android Market上,你还可以在你的博客上发布。而且有传言,Amazon已近在最近准备搭建他们自己的Android 应用程序商店了。
  • 除了了技术性的SDK 文档外,还可以找到其他更多的使用者和开发者的资源。

  闲话少说——下面让我们进入正题,开始开发我们的Android应用程序。

  安装Eclipse和Android SDK

  Android应用程序的推荐开发环境是带有Android开发包插件(Android Devlopment Toolkit (ADT))的Eclipse。我在这里简要说明一下安装流程。如果你需要更多的细节,Google的开发人员网页中详尽地解释了具体的安装配置过程

  • 为你的平台下载Android SDK(Windows , Mac OS X 或者 Linux)。
  • 在你的硬盘上解压下载文件 (在Linux, 我使用 /opt/local/).
  • 如果你没有安装Eclipse,下载并安装Eclipse JAVA 集成开发环境包。 用于编程的话, Google推荐使用Eclipse 3.5 (Galileo).
  • 运行Eclipse 并选择Help->Install New Software.
  • 在Available Software窗口中点击Add按钮。
  • 进入 Android Development Tools 的Name输入框, 在Location 输入框输入https://dl-ssl.google.com/android/eclipse/
  • 检查可用软件中有Developer Tools并点击OK按钮。这将安装Android Development Tools 和DDMS, Android的调试工具。

  • 点击Next和Finish按钮以完成安装,安装完成后,你需要重启你的Eclipse一次。
  • 在Eclipse重启后,选择Window->Preference 后你可以在分类列表中看到Android这一项了。
  • 现在需要告诉Eclipse,你的Android SDK安装在什么地方。点击Android项后浏览选择你解压后的Android SDK所在的路径。例如/opt/local/android-sdk。

  • 点击OK按钮,保存信息。

  选择Android 平台

  在你开始编写Android应用程序之前,你需要为你需要开发应用程序的Android设备下载SDK平台。每个平台都有可以安装在用户设备上的不同版本的SDK。对于Android1.5或以上版本,有两个可用的平台: Android Open Source Project 和 Google.

  Android Open Source Project 平台是开源的,但是不包括Google公司的私有化扩展,比如Google Map。如果不选择使用Google的API,Google的地图功能就不会在你的应用程序中生效。除非你有特别的原因,否则我们推荐你选择Google平台,因为这样你可享受到Google的扩展类库提供的便利。

  • 选择Window Android SDK and AVD Manager.
  • 点击左栏中的Available Packages 并选择选择Respository中有效的Android SDK平台。
  • 你可以选择列表中所需要的平台,或全选下载所有有效的平台。当你选择完毕,单击Install Selected 并完成安装。


  一旦成功的下载所有的平台后,你就可以准备开始开发Android应用程序了。

  创建一个新的Android项目

  Eclipse的新建项目向导能为你创建一个新的Android项目,并生成可以开始运行的文件和代码。通过向导生成代码,可以让你马上得到一个Android程序运行的直观映像并为你提供了一个帮助你快速入门的方法:

  • 选择 File->New->Project…
  • 选择Android Project
  • 在New Project 对话框, 键入如下的设置:
1
2
3
4
5
6
Project Name: BrewClock
Build Target: Google Inc. 1.6 (Api Level 4)
Application Name: BrewClock
Package Name: com.example.brewclock
Create Activity: BrewClockActivity
Min SDK Version: 4

  在点击了完成按钮之后,Eclipse将为你创建一个新的可以运行的Android项目。注意,你通知了Eclipse生成了一个叫做BrewClockActivity的Activity。这个Activity的代码用于运行你的应用程序。生成的代码将在程序运行时非常简单地显示一条“Hello World”消息。

  包

  包名是你的应用程序标示。当你开始准备在Android Market上发布你的应用程序的时候,Android用这个标识符精确地记录你的应用程序的更新过程,因此让包名唯一是非常重要上海企业网站设计与制作的。尽管我们在这里使用了com.example.brewclock这样的名字空间,对于真实的应用程序,你应该选择类似于com.你的公司名.你的应用程序名 这样的包名。

  SDK 版本

  Min SDK Version 是你的Android程序所能运行得最早版本号。对于每个新发布的Android,SDK会增加并修改一些方法。通过选择一个版本号,Android(Android Market)会知道你的应用程序能运行在等于或晚于指定版本的设备之上。

  运行你的应用程序

  现在让我们开始在Eclipse中运行我们的应用程序。由于是第一次运行,Eclipse将会询问你的项目类型:

  • 选择Run->Run 或 按下 Ctrl+F11.
  • 选择Android Application 并点击 OK 按钮.

  Eclipse 将会在一个Android设备上运行一个应用程序。在这个时候,由于你没有任何Android设备,因此在运行时一定会返回一个失败,并且询问你是否要新建一个Android的虚拟设备。(AVD)

  Android 虚拟设备

  Android 虚拟设备 (AVD) 是一个模拟真实世界中Android设备的模拟器,例如移动电话或平板电脑。你可以在不买任何真实Android设备情况下,使用AVD测试你的应用。

  你可以创建任意多个你喜欢的AVD,每个可以建立在不同版本的Android平台之上。对于你创建的每个Android设备,你可以配置不同的硬件属性,比如是否具有物理键盘,是否支持GPS,摄像头的像素,等等。

  在你开始运行你的应用程序之前,你需要创建你的AVD,来运行指定的SDK平台(Google APIs 1.6)。

  现在让我开始:

  • 如果还没有开始运行你的应用程序,点击run(或按下 Ctrl+F11)。
  • 当目标设备弹出警告,点击Yes 以创建新的AVD。
  • 单击Android SDK and AVD Manager 对话框内的New 按钮.
  • 为你的AVD键入如下的设置:
1
2
3
4
Name: Android_1.6
Target: Google APIs (Google Inc.) - API Level 4
SD Card Size: 16 MiB
Skin Built In: Default (HVGA)
  • 单击 Create AVD 让Android为你创建一个新虚拟设备。
  • 关闭the Android SDK and AVD Manager 对话框.

  运行代码

  再次运行你的应用程序(Ctrl+F11)。 Eclipse 将build 你的项目并运行一个新的AVD。记住,AVD模拟了一个完全的Android系统,因此你需要有耐心来等待这个缓慢的启动过程,就如同你重启真实的Android设备一样。一个好的做法是不要关闭你的AVD,直到你完成了你一天的工作。
  当你的模拟器启动后,Eclipse自动地安装并运行你的应用程序。

  开发你第一个Android应用

  生成的代码能良好的运行,但是你真正想要的是开发一个真实的应用程序。为此,我们首先果一个咸蛋的设计流程,并开始创建一个可以让你部署在Android设备上的应用。

  大部分的开发者(包括我自己)都喜欢每天一杯咖啡或茶。在下一节中,你将开发一个简单的泡茶计数器应用程序来记录用户泡了多少杯茶,并为泡每杯茶做一个定时器。

  你可以从GitHub下载整个教程的源代码.

  设计用户界面

  在开发任何Android应用程序之前的第一步就是设计和开发用户界面。下面是一个我们这个应用程序的用户界面的一个概览。

  用户将能通过+和-按钮设置一个泡茶的定时器。当单击开始按钮,定时器将开始按指定的时间递减。除非用户再次点击按钮以取消计时,否则当定时器为0的时候,累计的泡茶计数brew将增加1。

  开发用户界面

  Android 用户界面或布局layouts, 是通过XML文档来描述的,可以在项目的res/layouts目录下找到。在之前运行在模拟器上代码中,我们可以看到由eclipse自动生成的布局代码在res/layouts/main.xml 中。

  Eclipse有一个图形化的布局设计器,通过在屏幕上的拖拽控制来完成布局的设计,然而,我却发现直接写XML并使用图形布局来预览是更容易的方式。

  现在让我们对main.xml做一些工作以达到上图的效果:

  • 在Eclipse中通过双击PackageExplorer的res/layouts/main.xml 来打开xml。
  • 点击屏幕下方main.xml 来切换为xml视图。

  将main.xml中内容改为如下的内容:

# /res/layouts/main.xml
xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android&#61;"http://schemas.android.com/apk/res/android"
android:orientation
&#61;"vertical"
android:layout_width
&#61;"fill_parent"
android:layout_height
&#61;"fill_parent">
<LinearLayout
android:orientation&#61;"horizontal"
android:layout_width
&#61;"fill_parent"
android:layout_height
&#61;"wrap_content"
android:padding
&#61;"10dip">
<TextView
android:layout_width&#61;"wrap_content"
上海闵行企业网站制作 android:layout_height
&#61;"wrap_content"
android:textSize
&#61;"20dip"
android:text
&#61;"Brews: " />
<TextView
android:layout_width&#61;"fill_parent"
android:layout_height
&#61;"wrap_content"
android:text
&#61;"None"
android:gravity
&#61;"right"
android:textSize
&#61;"20dip"
android:id
&#61;"&#64;&#43;id/brew_count_label" />
LinearLayout>
<LinearLayout
android:orientation&#61;"horizontal"
android:layout_width
&#61;"fill_parent"
android:layout_height
&#61;"wrap_content"
android:layout_weight
&#61;"1"
android:gravity
&#61;"center"
android:padding
&#61;"10dip">
<Button
android:id&#61;"&#64;&#43;id/brew_time_down"
android:layout_width
&#61;"wrap_content"
android:layout_height
&#61;"wrap_content"
android:text
&#61;"-"
android:textSize
&#61;"40dip" />
<TextView
android:id&#61;"&#64;&#43;id/brew_time"
android:layout_width
&#61;"wrap_content"
android:layout_height
&#61;"wrap_content"
android:text
&#61;"0:00"
android:textSize
&#61;"40dip"
android:padding
&#61;"10dip"/>
<Button
android:id&#61;"&#64;&#43;id/brew_time_up"
android:layout_width
&#61;"wrap_content"
android:layout_height
&#61;"wrap_content"
android:text
&#61;"&#43;"
android:textSize
&#61;"40dip" />
LinearLayout>
<Button
android:id&#61;"&#64;&#43;id/brew_start"
android:layout_width
&#61;"fill_parent"
android:layout_height
&#61;"wrap_content"
android:layout_gravity
&#61;"bottom"
android:text
&#61;"Start" />
LinearLayout>

  正如你所见的&#xff0c;Android的XML布局文件是繁琐的&#xff0c;但却能让你控制到屏幕的各个元素。

  在Android中最重要的接口元素是布局Layout容器&#xff0c;例如例子中使用的LinearLayout 。这些元素对于用户是不可见的,但是却扮演者例如Buttons 和TextViews这些元素的布局容器。

  Android中有几种不同类型的布局视图layout view&#xff0c;每一种都用于开发不同的布局。如同LinearLayout 和AbsoluteLayout &#xff0c;TableLayout 可以让你使用更为复杂的基于表格结构的布局。你可以在SDK的API文档的通用布局对象中查找到更多的布局。

  关联你的布局Layout与代码

  保存你的布局&#xff0c;在Eclipse中点击Run图标或按下Ctrl&#43;F11重新在模拟器中运行你的程序。你现看到不是之前出现的Hello World消息了&#xff0c;你将看到Android显示了一个新的界面。

  如果点击界面上的任何按钮&#xff0c;他们将期望的显示为高亮&#xff0c;但是不会执行任何操作。现在让我们在布局修改后改进一下我们的源码&#xff1a;

  # /src/com/example/brewclock/BrewClockActivity.java

...
import android.widget.Button;
import android.widget.TextView;

public class BrewClockActivity extends Activity {
/** Properties **/
protected Button brewAddTime;
protected Button brewDecreaseTime;
protected Button startBrew;
protected TextView brewCountLabel;
protected TextView brewTimeLabel;

...
}

  下一步,我们将修改调用onCreate。当Android启动你的应用程序的时候&#xff0c;Android会首先调用这个方法。 在Eclipse生成的代码中&#xff0c;onCreate把activity的视图设置成R.layout.main。这行代码告诉Android解释我们的布局配置XML文件&#xff0c;并显示它。

  资源对象

  在Android中&#xff0c;R是一个自动生成的对象&#xff0c;这是一个特殊的对象&#xff0c;你可以在代码中通过这个对象访问项目中的资源&#xff08;布局&#xff0c;字符串&#xff0c;菜单&#xff0c;图标&#xff0c;…&#xff09; 。每个资源都有一个给定的id。在上面的那个布局文件中&#xff0c;有一些&#64;&#43;id XML 属性。我们将通过这些值来关联布局中的Buttons 与TextViews和我们的代码和&#xff1a;

  # /src/com/example/brewclock/BrewClockActivity.java

...
public class BrewClockActivity extends Activity {
...
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.la上海徐汇企业网站制作yout.main);

// Connect interface elements to properties
brewAddTime &#61; (Button) findViewById(R.id.brew_time_up);
brewDecreaseTime
&#61; (Button) findViewById(R.id.brew_time_down);
startBrew
&#61; (Button) findViewById(R.id.brew_start);
brewCountLabel
&#61; (TextView) findViewById(R.id.brew_count_label);
brewTimeLabel
&#61; (TextView) findViewById(R.id.brew_time);
}
}

  监听事件

  为了检测到用户单击我们的按钮&#xff0c;我们需要实现一个监听器listener。你可能会从其他的事件驱动系统中熟悉监听器或回调函数callbacks。比如Javascript/JQuery事件或Rails的回调函数。

  Android通过Listener接口提供相似的机制&#xff0c;例如OnClickListener&#xff0c;这个接口中定义了那些会被事件触发的方法。当用户点击屏幕的时候&#xff0c;实现OnClickListener 接口将会通知你的应用程序&#xff0c;并告诉他们所按得屏幕按钮。你当然也需要告诉每个button的ClickListener&#xff0c;以便Android知道具体通知到那个监听器&#xff1a;

  # /src/com/example/brewclock/BrewClockActivity.java

...
// Be sure not to import
// &#96;android.content.dialoginterface.OnClickListener&#96;.
import android.view.View.OnClickListener;

public class BrewClockActivity extends Activity
implements OnClickListener {
...
public void onCreate(Bundle savedInstanceState) {
...
// Setup ClickListeners
brewAddTime.setOnClickListener(this);
brewDecreaseTime.setOnClickListener(
this);
startBrew.setOnClickListener(
this);
}
...
public void onClick(View v) {
// TODO: Add code to handle button taps
}
}

  下一步&#xff0c;我们将增加每个按钮按下的处理过程。我们将为Activity类增加4个属性&#xff0c;这些属性将用来让用户设置和记录我们泡茶时间&#xff0c;泡茶计数&#xff0c;计时器是否在运行的标志。

  # /src/com/example/brewclock/BrewClockActivity.java

...
public class BrewClockActivity extends Activity
implements OnClickListener {
...
protected int brewTime &#61; 3;
protected CountDownTimer brewCountDownTimer;
protected int brewCount &#61; 0;
protected boolean isBrewing &#61; false;
...
public void onClick(View v) {
if(v &#61;&#61; brewAddTime)
setBrewTime(brewTime
&#43; 1);
else if(v &#61;&#61; brewDecreaseTime)
setBrewTime(brewTime
-1);
else if(v &#61;&#61; startBrew) {
if(isBrewing)
stopBrew();
else
startBrew();
}
}
}

  注意我们使用了Android提供的类CountDownTimer 。这让我们非常容易的创建和开始一个简单的递减计数&#xff0c;这个递减计数在递减运行的时候&#xff0c;每当执行一个递减就发出一个通知。你将在下面的startBrew 方法中使用到这个计数器。

  在下面的方法是所有处理逻辑&#xff0c;这些处理逻辑用于处理设置泡茶时间&#xff0c;开始停止计数和维护计数器。我们同样地在onCreate方法中来初始化我们的 brewTime和 brewCount变量。

  将这些代码放入到不同的类中是一种好做法。但是为了简洁&#xff0c;我把我们所有的代码都放到了BrewClockActivity中&#xff1a;

  # /src/com/example/brewclock/BrewClockActivity.java

...
public class BrewClockActivity extends Activity
implements OnClickListener {
...
public void onCreate(Bundle savedInstanceState) {
...
// Set the initial brew values
上海徐汇企业网站设计与制作"color: #000000;"> setBrewCount(0);
setBrewTime(
3);
}

/**
* Set an absolute value for the number of minutes to brew.
* Has no effect if a brew is currently running.
*
&#64;param minutes The number of minutes to brew.
*/
public void setBrewTime(int minutes) {
if(isBrewing)
return;

brewTime
&#61; minutes;

if(brewTime < 1)
brewTime
&#61; 1;

brewTimeLabel.setText(String.valueOf(brewTime)
&#43; "m");
}

/**
* Set the number of brews that have been made, and update
* the interface.
*
&#64;param count The new number of brews
*/
public void setBrewCount(int count) {
brewCount
&#61; count;
brewCountLabel.setText(String.valueOf(brewCount));
}

/**
* Start the brew timer
*/
public void startBrew() {
// Create a new CountDownTimer to track the brew time
brewCountDownTimer &#61; new CountDownTimer(brewTime * 60 * 1000, 1000) {
&#64;Override
public void onTick(long millisUntilFinished) {
brewTimeLabel.setText(String.valueOf(millisUntilFinished
/上海企业网站制作style&#61;"color: #000000;"> 1000) &#43; "s");
}

&#64;Override
public void onFinish() {
isBrewing
&#61; false;
setBrewCount(brewCount
&#43; 1);

brewTimeLabel.setText(
"Brew Up!");
startBrew.setText(
"Start");
}
};

brewCountDownTimer.start();
startBrew.setText(
"Stop");
isBrewing
&#61; true;
}

/**
* Stop the brew timer
*/
public void stopBrew() {
if(brewCountDownTimer !&#61; null)
brewCountDownTimer.cancel();

isBrewing
&#61; false;
startBrew.setText(
"Start");
}
...
}

  这段代码唯一和Android相关的就是使用setText方法来设置文本的显示文字。在startBrew方法中&#xff0c;我们创建&#xff0c;并开始了一个CountDownTimer来开每秒递减计数直到计数器为0。注意&#xff0c;我们定义了CountDownTimer以内联方式监听onTick 和 onFinish方法。 onTick 方法将每1000毫秒&#xff08;1秒&#xff09;执行一次&#xff0c;并递减, 当计数器为0的时候&#xff0c;onFinish方法被调用。

  避免在你的代码中硬编码

  为了使教程代码简单&#xff0c;我故意地在程序中将控件的标号直接写到字串中&#xff08;例如&#xff1a; “Brew Up!”, “Start”, “Stop”&#xff09; 通常&#xff0c;这不是一个好的做法&#xff0c;因为如果在大型项目中&#xff0c;这样做会使得修改变得麻烦。

  Android 提供了一种简洁的方法让你使用R对象来使字符串和代码分离。R 让你在xml文件&#xff08;res/values/strings.xml&#xff09;定义所有你程序中字符串&#xff0c;并让你可以在代码中应用到这些字符串。例如&#xff1a;

  # /res/values/strings.xml

<string name&#61;"brew_up_label">Brew Up!string>
...

  # /res/com/example/brewclock/BrewClockActivity.java

...
brewLabel.setText(R.string.brew_up_label);
...

  现在&#xff0c;如果你想改变Brew Up! 字样&#xff0c;你只要一次性的修改strings.xml文件就行了。你的应用将生成一堆代码来保证你程序中所有使用到这些字符串的地方都能被生效&#xff01;

  运行Brew Clock

  代码完成之后&#xff0c;现在是试运行程序的时候了。单击Run 或 Ctrl&#43;F11 在模拟器中启动我们的应用. 所有都运行良好&#xff0c;你将会看到你创建的用户界面在准备时间一到就可以喝你所泡的茶了&#xff01;试着设置不同的时间&#xff0c;并点击Start 观看倒计时。

  总结

  在这个关于Android的简单介绍中&#xff0c;你已学会如何安装Android SDK和Eclipse的Android 开发工具插件&#xff08;ADT&#xff09;。你也学会如何创建一个模拟设备&#xff0c;并通过这个设备来测试你的应用程序。你还学会了如何开发Android应用程序。上面了那些作为标题的关键概念在以后你自己开发Android应用程序的时候将会经常用到。

  我们希望&#xff0c;这个教程能激发你的开发移动应用程序的欲望&#xff0c;并步入这个令人激动的领域。Android为当前和即将到来的移动设备应用程序开发提供了一条宽广的道路。如果你已经开发你自己的移动应用&#xff0c;请在评论中告诉我们。



推荐阅读
  • Java程序设计第4周学习总结及注释应用的开发笔记
    本文由编程笔记#小编为大家整理,主要介绍了201521123087《Java程序设计》第4周学习总结相关的知识,包括注释的应用和使用类的注释与方法的注释进行注释的方法,并在Eclipse中查看。摘要内容大约为150字,提供了一定的参考价值。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • Week04面向对象设计与继承学习总结及作业要求
    本文总结了Week04面向对象设计与继承的重要知识点,包括对象、类、封装性、静态属性、静态方法、重载、继承和多态等。同时,还介绍了私有构造函数在类外部无法被调用、static不能访问非静态属性以及该类实例可以共享类里的static属性等内容。此外,还提到了作业要求,包括讲述一个在网上商城购物或在班级博客进行学习的故事,并使用Markdown的加粗标记和语句块标记标注关键名词和动词。最后,还提到了参考资料中关于UML类图如何绘制的范例。 ... [详细]
  • 如何实现JDK版本的切换功能,解决开发环境冲突问题
    本文介绍了在开发过程中遇到JDK版本冲突的情况,以及如何通过修改环境变量实现JDK版本的切换功能,解决开发环境冲突的问题。通过合理的切换环境,可以更好地进行项目开发。同时,提醒读者注意不仅限于1.7和1.8版本的转换,还要适应不同项目和个人开发习惯的需求。 ... [详细]
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
  • 开发笔记:spring boot项目打成war包部署到服务器的步骤与注意事项
    本文介绍了将spring boot项目打成war包并部署到服务器的步骤与注意事项。通过本文的学习,读者可以了解到如何将spring boot项目打包成war包,并成功地部署到服务器上。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了一款名为TimeSelector的Android日期时间选择器,采用了Material Design风格,可以在Android Studio中通过gradle添加依赖来使用,也可以在Eclipse中下载源码使用。文章详细介绍了TimeSelector的构造方法和参数说明,以及如何使用回调函数来处理选取时间后的操作。同时还提供了示例代码和可选的起始时间和结束时间设置。 ... [详细]
  • 使用eclipse创建一个Java项目的步骤
    本文介绍了使用eclipse创建一个Java项目的步骤,包括启动eclipse、选择New Project命令、在对话框中输入项目名称等。同时还介绍了Java Settings对话框中的一些选项,以及如何修改Java程序的输出目录。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
author-avatar
元元木樨_669
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有