您的位置:首页 > 移动开发 > Android开发

android 启动界面广告的显示

2015-12-16 22:23 405 查看

1.问题:

现在很多应用在启动界面加上一些广告或者在特殊的节日显示不同的slogn,具体实现的方案有两种:

1. 启动的时候去拉取图片,这样实时性会很高,但是在网络不好的情况下会加载失败

2. 在用户使用应用的过程中将新的图片下载下来,等用户下次启动应用的时候显示出来,这样实时性不高,但是感觉效果较好

我实现的就是第二方案。

2.思路:

第一步:判断是否显示广告图

第二步:如果需要, 获取广告图的链接,判断md5(url).jpg的图片是否存在于sd卡中。如果存在就不下载,反之就下载,并设置下一次显示的标志位,并将路径保存起来

第三步:下一次启动时,显示图片就好了

package com.example.cheng.splashtest;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageView;

public class SplashActivity extends Activity {

private ImageView adImage;
private int SPLASH_DISPLAY_LENGHT = 3000;//3s之后跳转
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_splash);
initViews();
SpUtil.init(getApplicationContext()); //初始化shareP
showAd();
toMain();
}

private void initViews()
{
adImage = (ImageView)findViewById(R.id.adImage);
}

private void showAd()
{
if(SpUtil.getInt(Constant.SP_AD_KEY) == Constant.SHOW_AD)
{
//显示广告图
Bitmap bm = BitmapFactory.decodeFile(SpUtil.getString(Constant.SP_ADPATH_KEY));
adImage.setImageBitmap(bm);

}
}
private void toMain()
{
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
Intent intent = new Intent(SplashActivity.this,MainActivity.class);
SplashActivity.this.startActivity(intent);
SplashActivity.this.finish();
}
},SPLASH_DISPLAY_LENGHT);
}


package com.example.cheng.splashtest;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;

/**
* Created by cheng on 15/12/16.
*/
public class MainActivity extends Activity
{
private String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
PhoneUtil.init(getApplicationContext());
checkAd();
}

///////////////////////////////////////////////////////
//检查是否显示广告图
//1:判断是否显示广告图  2. 获取广告图的链接,判断md5(url).jpg的图片是否存在于sd卡中
//3.如果存在就不下载,反之就下载,并设置下一次显示的标志位
public void checkAd()
{
//是否需要显示广告
//if(需要)
//{
String filepath = PhoneUtil.getAdPath();
String filename = Md5Util.stringMd5(Constant.AD_URL) + ".jpg";
SpUtil.setString(Constant.SP_ADPATH_KEY, filepath + filename);//将图片的路径保存起来
//判断广告图是否存在
if(!PhoneUtil.isFileExit(filepath+filename))
{
Log.v(TAG, "开始下载:" + filepath + filename);
//不存在的时候
new DownloadUtil().excute(mAdHandler, Constant.AD_URL, filepath, filename);

}
//        else{
//             如果不需要显示广告可以把本地广告图片删掉
//        }

}

private Handler mAdHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if(msg.what == Constant.HANDLER_DOWNLOAD)
{
Log.v(TAG,"图片下载成功");
//下载成功之后设置标志位,下一次显示广告
SpUtil.setInt(Constant.SP_AD_KEY,Constant.SHOW_AD);
}
}
};
}


package com.example.cheng.splashtest;

import android.content.Context;
import android.content.SharedPreferences;

/**
* Created by ZedLi on 2015/12/16.
*/
public class SpUtil
{
private static SharedPreferences mSp;
public static void init(Context context)
{
mSp =context.getSharedPreferences("ad",Context.MODE_PRIVATE);
}

public static void setInt(String key,int value)
{
SharedPreferences.Editor editor = mSp.edit();
editor.putInt(key,value);
editor.commit();
}

public static int getInt(String key)
{
return mSp.getInt(key, Constant.HIDE_AD);
}

public static void setString(String key,String value)
{
SharedPreferences.Editor editor = mSp.edit();
editor.putString(key,value);
editor.commit();
}

public static String getString(String key)
{
return mSp.getString(key,null);
}
}


package com.example.cheng.splashtest;

import android.content.Context;
import android.os.Environment;
import android.util.DisplayMetrics;

import java.io.File;

/**
* Created by ZedLi on 2015/12/1.
*/
public class PhoneUtil {

private static int PHONE_WIDTH;
private static int PHONE_HEIGHT;
private static String ROOT_PATH; //app项目根目录
private static String AD_PATH;//app存放广告的目录
private static String VIDEO_PATH;//app存放video目录
private static String VOICE_PATH;//app存放Voice目录

public static void init(Context context)
{
DisplayMetrics dm = context.getResources().getDisplayMetrics();
PHONE_WIDTH = dm.widthPixels;
PHONE_HEIGHT = dm.heightPixels;

if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
ROOT_PATH = Environment.getExternalStorageDirectory().getPath()+"/"+context.getPackageName()+"/file/";
else
ROOT_PATH = context.getFilesDir().getPath().toString()+"/";

AD_PATH = ROOT_PATH + "ad/";

}

public static int getPhoneWidth()
{
return PHONE_WIDTH;
}

public static int getPhoneHeight()
{
return PHONE_HEIGHT;
}

//file目录
public static String getAppFilePath()
{
File file = new File(ROOT_PATH);
if(!file.exists())
{
file.mkdirs();
}
return ROOT_PATH;
}

public static String getAdPath()
{
File file = new File(AD_PATH);
if(!file.exists())
{
file.mkdirs();
}
return AD_PATH;
}
public static boolean isFileExit(String path)
{
File file = new File(path);
return file.exists();
}
}


3. 总结

思路其实很简单,其实就是一个下载图片的过程,为了保证图片的的唯一,我们将图片链接的md5值作为保存的图片名,这样服务器换图片之后,链接也就随之发生了变化,这样就能保证启动图片也能随之变化



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: