0%

Java的JDK里默认没加数据库驱动,所以我们要先下载mysql-connector-java-5.1.17.zip, 下完后解压,有个mysql-connector-java-5.1.17-bin.jar文件,在Eclipse项目构建路径里加上。 假设我们的数据库在本机上,帐号是root,密码为空,有个名为tudou的数据库,里面有个album的表,表里有个name字段,下面我们就用Java读取name字段。

package com.pocketdigi;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class Main {
    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        String driver = "com.mysql.jdbc.Driver";
        String url = "jdbc:mysql://127.0.0.1:3306/tudou";
        //jdbc:mysql://IP:端口/数据库名
        String user = "root";
        String password = "";
        Class.forName(driver);
        Connection conn = DriverManager.getConnection(url, user, password);
        // statement用来执行SQL语句
        Statement statement = conn.createStatement();
        // 要执行的SQL语句
        String sql = "select * from album";
        ResultSet rs = statement.executeQuery(sql);  
        while(rs.next()) { 
            System.out.println(rs.getString("name") );
            //循环输出字段值
        }
        rs.close();
        conn.close();
        //关闭

    }
}

2011.10.19注,上面的方法插入中文可能会乱码,连接数据库可以用下面的方法:

Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/tudou?user=root&password=&useUnicode=true&characterEncoding=utf-8");

就是把用户名,密码以及编码都写进URL里

中文版的IE,如果PHP不在header发送文件编码,文件类型,而HTML的head标签也没写charset的话,默认把php输出显示为gb2312的html文件。今天我要显示一段XML代码,而这段代码又不是很标准,因为第一行不是,IE默认把它当成了HTML文件,而没有显示树状结构。因此,我们需要在PHP echo代码前,加上一段发送header的代码:

header("Content-type: text/xml; charset=utf-8");

本文并非帮Adview打广告,只是我个人认为这个工具挺好用,又是免费的,所以向各位开发者朋友推荐。同类的平台好像还有果合,没用过,因为我觉得Adview已经满足我的要求了,所以在此不做对比。 以目前国内的消费环境,我们应用开发者要解决吃饭问题还是得靠广告,收费不太现实。目前国内移动广告平台很多,像有米、微云、哇棒等等,国外有大名鼎鼎的Admob,各个平台都有自己的优点,也有不足。其实我们开发者最关注的是展示率、点击率、单价,谁能让我们赚到的钱多,我们就跟谁合作。比如说Admob,都说它单价最高,但是从最近几天来看,也就是0.02美元左右,而且因为语言原因,展示率、点击率相较于国内平台要低一些,我的ecpm只有0.1美元,每天收入多的时候就1美元多点,少的时候才0.1美元(我每天的活跃用户数还是比较稳定的,但是点击率有时却差十倍)。而国内的广告平台,在支付方面要方便得多,一般都直接打到卡上,或者支付宝。在单价方面,如果Admob一直是0.02美元,那也不比国内平台高多少,但国内平台因为是中文广告,点击率要高一些。 这里就有一个问题,因为广告平台的价格都是动态调整的,很可能某段时间某个平台的广告价格很低,而其他的比这个高,为了获取更多的收入,我们就希望显示高价的广告。而Adview就提供这样一个功能,Adview有个SDK,我们在开发程序过程中,把Adview的SDK和以后要用到的广告平台的SDK加入程序中(Adview支持十多种广告平台,但如果确定不会用的广告平台,还是建议不要加,加载太多Eclipse会卡,而且也会增大程序包体积),加入Adview的调用代码(广告平台原来的代码的不用加,Adview会动态管理)。添加完成后,我们就可以在Adview的网站管理我们的广告,想显示哪个平台的广告可以随意设置,而且可以设置多个平台,按设置的比例显示。当某个平台单价下降时,我们可以在网站上切换到其他平台。 Adview的报告中有每天各个广告平台广告的显示数,点击数,点击率,不过貌似跟有米显示的差别很大。比如昨天,我的一个应用有米显示点击数71,但是Adview显示有17 2.无效点击有点高。 Adview还有个应用互推功能,可以帮助开启应用互推的应用相互推荐,相互显示对方广告。 总的来说,Adview还不错,极大地方便了开发者管理广告,同时又是免费的。我现在觉得唯一的不足就是没有根据用户手机地区、语言切换广告的功能,要是可以在国外用户手机上显示Admob,国内手机用户显示有米,对提高开发者的收入很有帮助。 最后附上注册地址:http://www.adview.cn/reg/reg.php?user=webmaster@pocketdigi.com 后面的email是我的帐号,推荐注册送积分而已,对你没有任何损失。

今天下午,电脑搬到另一房间后,打开Eclipse,继续写程序,但是在部署程序到手机时突然就报错(不是Eclipse报错),上午一直都是正常能用的,虽然我改了几句代码,但是报错是另一个Activity,并不是我改的,很郁闷,找了很久也没发现原因。最后,点项目-清理,清理了一下出错的项目,再运行,竟然正常了…. 出现类似问题的朋友可以试试,别问我原因,我也不知,但相信跟搬电脑没关系吧。

今天学习给ProgressBar换个样式,先看效果图: 原理:在XML文件中分别定义进度条背景、第一进度颜色、第二进度颜色,然后在ProgressBar的android:progressDrawable属性应用即可。 先在drawable下建立progressbar_style.xml文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<layer-list
  xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@android:id/background">
        <shape>
            <corners android:radius="5.0dip" />
            <gradient android:startColor="#656666" android:endColor="#dbdedf" android:angle="270.0" android:centerY="0.75" android:centerColor="#bbbbbc" />
        </shape>
    </item>
    <item android:id="@android:id/secondaryProgress">
        <clip>
            <shape>
                <corners android:radius="8.0dip" />
                <gradient android:startColor="#e71a5e" android:endColor="#6c213a" android:angle="90.0" android:centerY="0.75" android:centerColor="#ac6079" />
            </shape>
        </clip>
    </item>
    <item android:id="@android:id/progress">
        <clip>
            <shape>
                <corners android:radius="8.0dip" />
                <gradient android:startColor="#464647" android:endColor="#2d9ae7" android:angle="270.0" />
            </shape>
        </clip>
    </item>
</layer-list>

分别定义背景,第一进度颜色,第二进度颜色 gradient是渐变,前面已经说过,corners定义的是圆角 布局中:

<ProgressBar android:id="@+id/progressBar1" android:layout_width="fill_parent" android:layout_height="wrap_content"
style="?android:attr/progressBarStyleHorizontal" android:progressDrawable="@drawable/progressbar_style"
android:progress="50" android:max="100" android:secondaryProgress="70"
></ProgressBar>

2011年7月6日新增:本程序需要android.permission.ACCESS_WIFI_STATE android.permission.CHANGE_WIFI_STATE 权限 在Android中,WIFI是由WifiManager管理的,WifiManager有个setWifiEnabled方法可以直接打开与关闭WIFI,非常简单方便

package com.pocketdigi.wifi;
import android.app.Activity;
import android.content.Context;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class WIFIActivity extends Activity {
    /** Called when the activity is first created. */
    Button open, close;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        open = (Button) findViewById(R.id.open);
        close = (Button) findViewById(R.id.close);
        final WifiManager wm = (WifiManager) this
                .getSystemService(Context.WIFI_SERVICE);
        // 得到WifiManager对象
        open.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                if (wm.getWifiState() == WifiManager.WIFI_STATE_DISABLED) {
                    // 判断是否处理关闭状态,其他状态(已打开、正在关闭、正在打开、未知)不操作
                    wm.setWifiEnabled(true);
                    // 打开WIFI
                }
            }
        });
        close.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                if (wm.getWifiState() == WifiManager.WIFI_STATE_ENABLED) {
                    // 与上同,不解释
                    wm.setWifiEnabled(false);
                }
            }
        });
    }
}

XML只有两个BUTTON控件,不贴了。

Android在开机启动完成后,会发送一个action为android.intent.action.BOOT_COMPLETED的广播,因此,要实现程序开机启动,只要监听这个广播即可。 先写个广播接收器:

package com.pocketdigi.com;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class Receiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        Intent it=new Intent(context,AutoRunActivity.class);
        it.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(it);
        //貌似程序在没有运行时,必须加Intent.FLAG_ACTIVITY_NEW_TASK
    }

}

然后在AndroidManifest.xml中注册接收器,并且加上intent-filter

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.pocketdigi.com"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="7" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".AutoRunActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <receiver android:name=".Receiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"></action>
                <category android:name="android.intent.category.HOME"></category>
            </intent-filter>
        </receiver>
    </application>
</manifest>

OK,就这么简单,试试吧

2011年7月13日加注:所有的定时任务在手机重启后会消失,如果需要重启后继续用,可以加个开机自启,然后重新设置. AlarmManager可以在指定的时间执行指定的任务,最常用的功能就是利用这个类写闹铃程序。 下面开始学习AlarmManager用法。 首先,设置AlarmManager在指定的时间发送广播:

package com.pocketdigi.alarm;

import java.util.Calendar;

import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;

public class AlarmActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Calendar c=Calendar.getInstance();

        c.set(Calendar.YEAR,2011);
        c.set(Calendar.MONTH,Calendar.JUNE);//也可以填数字,0-11,一月为0
        c.set(Calendar.DAY_OF_MONTH, 28);
        c.set(Calendar.HOUR_OF_DAY, 19);
        c.set(Calendar.MINUTE, 50);
        c.set(Calendar.SECOND, 0);
        //设定时间为 2011年6月28日19点50分0秒
        //c.set(2011, 05,28, 19,50, 0);
        //也可以写在一行里
        
        Intent intent = new Intent("cn.pocketdigi.update.alarm");
        intent.setClass(this, AlarmReceiver.class);

        PendingIntent pi=PendingIntent.getBroadcast(this, 0, intent,0);
        //设置一个PendingIntent对象,发送广播
        AlarmManager am=(AlarmManager)getSystemService(ALARM_SERVICE);
        //获取AlarmManager对象
        am.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pi);
        
        //时间到时,执行PendingIntent,只执行一次
        //AlarmManager.RTC_WAKEUP休眠时会运行,如果是AlarmManager.RTC,在休眠时不会运行
        //am.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), 10000, pi);
        //如果需要重复执行,使用上面一行的setRepeating方法,倒数第二参数为间隔时间,单位为毫秒
       
    }
}

下面写个广播接收器:

package com.pocketdigi.alarm;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class AlarmReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        System.out.println("收到广播");
        Intent it=new Intent(context,AlarmActivity.class);
        it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(it);
        //收到广播后启动Activity,简单起见,直接就跳到了设置alarm的Activity
                         //intent必须加上Intent.FLAG_ACTIVITY_NEW_TASK flag
    }
}

AndroidManifest.xml里加上receiver:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.pocketdigi.alarm"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="7" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".AlarmActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <receiver android:name=".AlarmReceiver">
             <intent-filter>
                <action android:name="cn.pocketdigi.update.alarm" />
            </intent-filter>
        </receiver>
    </application>
</manifest>

注册广播接收器receiver,注意android:process,该值是广播进程的名字,貌似可以随便填,不填默认是包名,但是必须填,经真机测试,如果不填,在AlarmManager时间设为过去的时间时,会不停收到广播(死循环) 前面加.或:

下面的以ActivityB结束ActivityA为例: 首先在ActivityA中定义一个Activity的静态全局变量:

static Activity ActivityA;

在OnCreate()方法中给ActivityA赋值:

ActivityA=this;

在ActivityB中,需要结束ActivityA时,调用

ActivityA.ActivityA.finish();

另外,也可以在ActivityA中加入一个广播接收器,当收到广播时退出,而在ActivityB中,需要结束ActivityA时发送广播即可。